我正在循环一个列表并在该循环中循环我正在循环从mongodb获取的一些文档。但是在输出控制台中我只能看到一次迭代。 但外循环工作正常。当我调试它进入外部循环但不进入内部循环。请帮帮我。
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 ")
输出 在第二次迭代中,它没有到达line: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
答案 0 :(得分:2)
问题在于:
documents = icps_db.user.find({})
在第一次迭代documents
之后,光标用完了。它是一次性读取容器。您需要缓存结果或在内循环之前执行documents.rewind()
。
要缓存结果,请执行以下操作:
documents = list(icps_db.user.find({}))
我真的不知道MongoDB,所以有可能每个文档都有某种使用游标的实时回调(我对此表示怀疑)。如果是这样,简单的缓存将不起作用。
另一种解决方案是使用rewind()
:
将此光标倒回到未评估的状态。
如果光标已部分或完全评估,请重置此光标。 光标上的任何选项都将保持有效。 对此游标执行的将来迭代将导致新查询 发送到服务器,即使结果数据已经存在 通过此光标检索。
像这样使用它:
for name in name_set:
documents.rewind()
for idx, document in enumerate(documents):
...