每个循环的Python都不起作用

时间:2017-02-08 15:38:00

标签: python mongodb

我正在循环一个列表并在该循环中循环我正在循环从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

1 个答案:

答案 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):
        ...