10

Próbuję utworzyć kwerendę agregacji za pomocą kolby-mongoengine, a z tego, co przeczytałem, nie brzmi jak to jest możliwe.Zapytanie agregacyjne kolba-MongoEngine i PyMongo

Przejrzałem kilka wątków na forach, wiadomości e-mail i kilka pytań dotyczących Stack Overflow, ale nie znalazłem dobrego przykładu, jak zaimplementować agregację z monolitycznym kolbem.

Istnieje komentarz w this question, który mówi, że musisz użyć "nieprzetworzonej funkcji pymongo i agregacji". Jednak nie ma przykładów, jak to może działać. Mam majsterkowanie w Pythonie i mam podstawową aplikację za pomocą struktury Flask, ale zagłębianie się w pełnoprawne aplikacje & łączenie/wysyłanie zapytań do Mongo jest dla mnie całkiem nowe.

Czy ktoś może podać przykład (lub link do przykładu) tego, w jaki sposób mogę wykorzystać moje modele z kolbowym mongogensem, ale zapytanie za pomocą struktury agregacji z PyMongo? Czy będzie to wymagało dwóch połączeń z MongoDB (jeden dla PyMongo, aby wykonać zapytanie agregacyjne, a drugi dla zwykłego zapytania/wstawienia/aktualizacji za pośrednictwem MongoEngine)?

przykładem kwerendy agregacji chciałbym wykonać to w następujący sposób (ta kwerenda pobiera mi dokładnie informacje chcę w Mongo shell):

db.entry.aggregate([ 
    { '$group' : 
     { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' }, 
      'count' : { '$sum' : 1 } 
     } 
    } 
]) 

przykładem wyjścia z tej kwerendy:

{ "_id" : { "carrier" : "Carrier 1", "category" : "XYZ" }, "count" : 2 } 
{ "_id" : { "carrier" : "Carrier 1", "category" : "ABC" }, "count" : 4 } 
{ "_id" : { "carrier" : "Carrier 2", "category" : "XYZ" }, "count" : 31 } 
{ "_id" : { "carrier" : "Carrier 2", "category" : "ABC" }, "count" : 6 } 

Odpowiedz

13

Klasa swoje określić z Mongoengine faktycznie ma _get_collection() metodę pobierającą „surowego” obiektu kolekcji wprowadzone w sterowniku pymongo.

Ja tylko używając nazwy Model tutaj jako zastępczy dla rzeczywistej klasy zdefiniowanej dla połączenia w tym przykładzie:

Model._get_collection().aggregate([ 
    { '$group' : 
     { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' }, 
      'count' : { '$sum' : 1 } 
     } 
    } 
]) 

Więc można zawsze uzyskać dostęp do obiektów pymongo bez ustanowienia oddzielnego połączenia. Mongoengine sam jest zbudowany na pymongo.

+0

Awesome! Dziękuję Ci bardzo. To było trochę kłopotliwe, gdy próbowałem znaleźć rozwiązanie. Testowałem metodą "_get_collection()" i byłem w stanie uzyskać wyjście z Mongo. – SirCobalt

+0

Znakomita odpowiedź !! Aby dodać do tego, jeśli chcesz uruchomić klauzulę group by na niektórych rekordach, możesz użyć operatora $ match w następujący sposób: 'Model._get_collection(). Agregat ([ { " $ match " : qs._query, }, } {'$ grupa': {'_id': {'carrier': '$ carrierA', 'category': '$ category'}, 'count': {'$ sum ": 1} } } ])' gdzie qs jest instancją zapytania zapytania MongoEngine. – Yahya

9

aggregate jest dostępny od Mongoengine 0.9. Link do API Reference.

jak nie ma w ogóle wokół przykład, oto jak wykonać kwerendy łączoną wykorzystując ramy agregacji z Mongoengine> 0,9

pipeline = [ 
    { '$group' : 
    { '_id' : { 'carrier' : '$carrierA', 'category' : '$category' }, 
     'count' : { '$sum' : 1 } 
    } 
    }] 

Model.objects().aggregate(*pipeline) 
+0

Niesamowite, dzięki – Jivan