Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用PyMongo迭代和更新文档?_Python_Mongodb_Pymongo - Fatal编程技术网

Python 如何使用PyMongo迭代和更新文档?

Python 如何使用PyMongo迭代和更新文档?,python,mongodb,pymongo,Python,Mongodb,Pymongo,我为MongoDB和PyMongo 2.6.3提供了一个简单的单客户端设置。目标是迭代集合中的每个文档集合,并在此过程中更新(保存)每个文档。我使用的方法大致如下: cursor = collection.find({}) index = 0 count = cursor.count() while index != count: doc = cursor[index] print 'updating doc ' + doc['name'] # modify doc ..

我为MongoDB和PyMongo 2.6.3提供了一个简单的单客户端设置。目标是迭代集合中的每个文档
集合
,并在此过程中更新(
保存
)每个文档。我使用的方法大致如下:

cursor = collection.find({})
index = 0
count = cursor.count()
while index != count:
    doc = cursor[index]
    print 'updating doc ' + doc['name']
    # modify doc ..
    collection.save(doc)
    index += 1
cursor.close()
问题在于
save
显然在修改光标中文档的顺序。
例如,如果我的集合由3个文档组成(
id
s为清晰起见省略):

上述程序输出:

> updating doc one
> updating doc two
> updating doc two
但是,如果删除了行
collection.save(doc)
,则输出变为:

> updating doc one
> updating doc two
> updating doc three

为什么会这样?安全地迭代和更新集合中的文档的正确方法是什么?

我无法重新创建您的情况,但可能是我一时兴起,因为从数据库中一个接一个地获取结果,实际上您正在创建更多的结果(保存并获取下一个结果)

您可以尝试将结果保存在列表中(这样,一次获取所有结果-可能会很重,具体取决于您的查询):


希望能有所帮助

在MongoDB中找到答案:

由于游标在其生命周期内未被隔离,因此如果文档发生更改,对文档进行的中间写入操作可能会导致游标多次返回文档。要处理此情况,请参阅上的信息

在光标上启用快照模式,这是一个很好的保证:

snapshot()
遍历
\u id
字段上的索引,并保证查询将返回每个文档(相对于
\u id
字段的值)不超过一次

要使用PyMongo启用快照模式,请执行以下操作:

cursor = collection.find(spec={},snapshot=True)

根据PyMongo
find()
。已确认此操作修复了我的问题。

快照可以正常工作

但在pymongo 2.9及更高版本上,语法略有不同

cursor = collection.find(modifiers={"$snapshot": True})
或者对于任何版本

cursor = collection.find({"$snapshot": True})

根据

的说法,这不是答案。但是试试
1+999等于1000
和“`1+999==1000`.@falsetru-thx只是为了简单起见而重新创建,仍然在学习python:)。现在好了吗?您如何修改文档?
doc['name']='newValue'
足够了吗?看起来
snapshot
在MongoDB 3.6中被弃用,在Mongo DB 4.0中被删除。未找到没有快照的解决方案。
snapshot
find()
。在此处找到可用的解决方案:。
cursor = collection.find(modifiers={"$snapshot": True})
cursor = collection.find({"$snapshot": True})