2017-02-08 5 views
1

Ich bin eine Liste looping und innerhalb dieser Schleife bin ich einige Dokumente loopen, die von mongodb abgerufen werden. Aber in der Ausgabekonsole kann ich nur eine Iteration sehen. Aber die äußere Schleife funktioniert gut. Wenn ich debugge, geht es in die äußere Schleife, aber nicht in die innere Schleife. Bitte hilf mir.Python für jede Schleife funktioniert nicht

client = MongoClient('mongodb://localhost:27017/') 
db = client['mydb'] 
documents = icps_db.user.find({}) 
name_set = ['john', 'marshal', 'ann' ...] 

    for name in name_set: 
     print(name) 
     for idx, document in enumerate(documents): 
      print (documents) 
      if name in document["filtered_words"]: 
       print ("Found " + name) 
      else: 
       print (name + " not found in document ") 

Ausgabe In der zweiten Iteration es nicht Linie nicht erreicht: print (str (idx)).

john 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
Found john 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
john not found in document 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
Found john 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
john not found in document 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
john not found in document 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
Found john 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
john not found in document 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
Found john 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
Found john 
<pymongo.cursor.Cursor object at 0x7faed0ad0910> 
john not found in document 
john 
marshal 
marshal 
+3

Sind Sie sicher, dass 'Dateien' nicht leer ist? Vielleicht drucken Sie diese Sammlung zuerst aus. –

+0

'Dokumente' ist wahrscheinlich leer. – kazemakase

+0

Dokumente sind definitiv leer – Bodao

Antwort

2

Das Problem ist hier:

documents = icps_db.user.find({}) 

Nach ersten Satz von Iterationen über documents den Cursor nach oben verwendet wird. Es ist ein einmal gelesener Container. Sie müssen entweder die Ergebnisse zwischenspeichern oder documents.rewind() vor Ihrer inneren Schleife tun.

die Ergebnisse nicht cachen:

documents = list(icps_db.user.find({})) 

Ich weiß nicht wirklich MongoDB, ist es so möglich, dass jedes Dokument eine Art von Live-Rückruf hat, die die Cursor verwendet (ich bezweifle es). Wenn dies der Fall ist, funktioniert das einfache Caching nicht.

würde die andere Lösung verwenden rewind() sein:

Rewind dieser Cursor auf seine unevaluierten Zustand.

Setzen Sie den Cursor zurück, wenn er teilweise oder vollständig ausgewertet wurde. Alle am Cursor vorhandenen Optionen bleiben aktiv. Zukünftige Iterationen, die an diesem Cursor ausgeführt werden, führen dazu, dass neue Abfragen an den Server gesendet werden, auch wenn die resultierenden Daten bereits mit diesem Cursor abgerufen wurden.

Verwenden Sie es wie folgt:

for name in name_set: 
    documents.rewind() 
    for idx, document in enumerate(documents): 
     ...