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