10

Ich versuche, eine Aggregation Abfrage mit Kolben-mongoengine zu machen, und von dem, was ich gelesen habe, es klingt nicht wie es möglich ist.Flask-MongoEngine & PyMongo Aggregation Abfrage

Ich habe mehrere Forum-Threads, E-Mail-Ketten und ein paar Fragen zu Stack Overflow angeschaut, aber ich habe kein wirklich gutes Beispiel dafür gefunden, wie man Aggregation mit Flask-Mongoengine implementiert.

Es gibt einen Kommentar in this question ist die sagt, Sie verwenden müssen „raw pymongo und Aggregation-Funktionalität.“ Es gibt jedoch keine Beispiele dafür, wie das funktionieren könnte. Ich habe mit Python gebastelt und habe eine grundlegende Anwendung auf mit Flask Rahmen, aber Eintauchen in vollwertiges Anwendungen & Verbindungs-/Abfrage zu Mongo ist ziemlich neu für mich.

Kann jemand ein Beispiel (oder einen Link zu einem Beispiel) geben, wie ich meine Kolben-Mongoengine-Modelle verwenden könnte, aber Abfrage mit dem Aggregations-Framework mit PyMongo? benötigen diese zwei Verbindungen zu MongoDB (eine für PyMongo die Aggregation Abfrage und eine zweite für die regelmäßige Abfrage/Insert/Update über MongoEngine ausführen)?

Ein Beispiel für die Aggregation Abfrage durchführen möchte ich wie folgt (diese Abfrage wird mir genau die Informationen, die ich in der Mongo Shell wollen):

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

Ein Beispiel für die Ausgabe dieser Abfrage:

{ "_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 } 

Antwort

13

die Klasse Ihres mit Mongoengine definiert tatsächlich eine _get_collection() Methode, die das „rohe“ Sammelobjekt wird wie im pymongo Treiber implementiert.

Ich verwende nur den Namen Model hier als Platzhalter für Ihre tatsächliche Klasse für die Verbindung in diesem Beispiel definiert:

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

So können Sie immer die pymongo Objekte zugreifen, ohne eine separate Verbindung hergestellt wird. Mongoengine ist selbst auf Pymongo gebaut.

+0

Awesome! Vielen Dank. Das hat mir Kopfschmerzen bereitet, als ich versuchte eine Lösung zu finden. Ich habe mit der Methode "_get_collection()" getestet und konnte die Ausgabe von Mongo erhalten. – SirCobalt

+0

Brilliant Antwort !! Wenn Sie die Klausel group by nur für bestimmte Datensätze ausführen möchten, können Sie den Operator $ match wie folgt verwenden: 'Model._get_collection(). Aggregate ([ { '$ match' : qs._query, }, {'$ group': {'_id': {'carrier': '$ carrierA', 'Kategorie': '$ category'}, 'count': {'$ sum ': 1} } } ]) ' wo qs eine Instanz von MongoEngine queryset ist. – Yahya

9

aggregate ist verfügbar seit Mongoengine 0.9. Link zur API Reference.

Da kein Beispiel gibt es auch immer um ist, ist hier, wie Sie eine Aggregat Abfrage Aggregation Rahmen mit Mongoengine ausführen> 0,9

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

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

Super, danke – Jivan

Verwandte Themen