MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak zliczyć wiele kluczy w tym samym zapytaniu agregującym $group MongoDB?

Istnieje kilka różnych podejść, których możesz tutaj użyć:

  1. Użyj mapy/redukuj:nie rób tego. W tej chwili znacznie szybciej byłoby uruchomić strukturę agregacji 3 razy niż użyć funkcji zmniejszania mapy w tym przypadku użycia.

  2. Uruchom agregację 3 razy. Nie jest to optymalne rozwiązanie, ale jeśli nie masz ograniczeń czasowych, to jest to najłatwiejsza opcja. Jeśli Twoje agregacje i tak zajmują

  3. Oto najlepsze rozwiązanie, jakie przychodzi mi do głowy. $group operator pozwala zbudować _id na wielu polach. Np. {"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}} . Spowoduje to utworzenie grupowania dla wszystkich istniejących kombinacji różnych klawiszy. Możesz potencjalnie pogrupować klucze w ten sposób, a następnie ręcznie zsumować wyniki w kliencie.

Pozwól, że rozwinę. Załóżmy, że mamy kolekcję kształtów. Te kształty mogą mieć kolor, rozmiar i rodzaj (kwadrat, koło itp.). Agregacja na podstawie identyfikatora z wieloma kluczami może wyglądać tak:

db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})

i zwrot:

"result" : [
        {
            "_id" : {
                "f1" : "yellow",
                "f2" : "medium",
                "f3" : "triangle"
            },
            "count" : 4086
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "small",
                "f3" : "triangle"
            },
            "count" : 4138
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "big",
                "f3" : "square"
            },
            "count" : 4113
        },
        {
            "_id" : {
                "f1" : "yellow",
                "f2" : "small",
                "f3" : "triangle"
            },
            "count" : 4145
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "small",
                "f3" : "square"
            },
            "count" : 4062
        }

... i tak dalej

Następnie zsumowałbyś wyniki po stronie klienta, przy drastycznie zmniejszonej liczbie wpisów. Zakładając, że liczba unikalnych wartości dla każdego klucza jest wystarczająco mała w porównaniu z całkowitą liczbą dokumentów, możesz wykonać ten ostatni krok w znikomym czasie.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Nie można kanonizować zapytania:BadValue Za dużo wyrażeń tekstowych

  2. Używanie .sort z PyMongo

  3. Zapytanie o czas ISODate w perl

  4. Ustawienie opcji smallfiles do kontrolowania kronikowania nie kontroluje rozmiaru

  5. Normalizacja MongoDB, klucz obcy i łączenie