2017-02-22 3 views
1

Ich arbeite mit einer MongoDB-Sammlung, die zu groß ist, um vollständig in Arbeitsspeicher geladen zu werden, und ich möchte mit PyMongo damit arbeiten.Get pymongo .find() Ergebnis als Liste von Listen einer bestimmten Größe zurückgegeben

Für jedes Element muss ich in einer anderen Sammlung suchen und eine Funktion auf das Ergebnis anwenden.

Der erste Algorithmus kam ich mit war:

for document in collection1.find(): 
    field1 = document['field'] 
    search = collection2.find({'field': field1}) 
    # Do some stuff with the search 

Aber eine Suche für jedes Element einfach zu viel Zeit Durchführung dauert, weil es für die Server-Antwort jedes Mal warten muss.

Um die Wartezeit pro Element zu reduzieren, versuche ich, Chargen von -say, 500 - Dokumente gleichzeitig zu verwenden.

Der einzige Weg, fand ich, wie dies zu tun ist auf einem Cursor die nächste() Methode verwendet

cursor = collection1.find() 
while cursor.alive: 
    batch_data = [] 
    for i in range(500): 
      batch_data.append(cursor.next()) 
    fields = [i['field'] for i in bath_data]: 
    search = collection2.find({'field': {"$in": fields}}) 
    # map each result to the correct document and then do my stuff 

dies sehr hacky scheint jedoch. Gibt es eine Möglichkeit, eine Suche in einer Sammlung durchzuführen und das Ergebnis als Liste von Stapeln einer bestimmten Größe zurückgeben zu lassen?

Antwort

0

Wenn ich richtig verstanden habe, versuchen Sie, zwei Sammlungen auf einem Feld zu verbinden. Wenn Sie MongoDB 3.2 oder eine neuere Version verwenden, können Sie $lookup operator im Aggregationsframework versuchen. Es ist das Äquivalent zum linken äußeren Join in relationalen Datenbanken. Aber ich bin mir nicht sicher, ob Pymongo das unterstützt oder nicht. Wenn es dies nicht unterstützt, können Sie möglicherweise die Operatoren $ limit und $ skip verwenden, um nicht die gesamte Sammlung in den Speicher zu laden. Sie können erreichen pymongo Dokumentation von here.

+0

PyMongo muss nichts tun, um $ lookup zu unterstützen, es übergibt Ihre gesamte Aggregation Pipeline an den Server, egal, welche Operatoren Sie angeben. –

+0

Danke, das werde ich mir merken. –