如何使用pymongo更新值?

我有一个这种forms的mongodb集合:

{id=ObjectId(....),key={dictionary of values}} where dictionary of values is {'a':'1','b':'2'.....} 

让数值字典为'd' 。 我需要在'd'更新密钥的值。 即我想改变'a':'1''a':'2'我怎样才能在pymongo?

代码是这样的:

 productData is a collection in mongoDB for p in productData.find(): for k,v in p.iteritems(): value=v['a'] value=value+1 v['a']=value 

现在反映productData中的新值。

这是我试过的,它引入了一个新的键值对,而不是更新

 for p in productData.find(): for k,v in p.iteritems(): value=v['a'] value=value+1 v['a']=value productData.update({'_id':mongoId},{"$set":{'d.a':'100'}},upsert=False) 

如果要将文档的值设置为任意值,则可以使用$ set语法。 如果该属性已经存在于文档中,则将更新该值,如果该属性不存在,则将其创build。 如果您需要在您所描述的字典中设置单个值,则可以使用点符号来访问子值。

如果p是检索的对象:

 existing = p['d']['a'] 

对于pymongo版本<3.0

 db.ProductData.update({ '_id': p['_id'] },{ '$set': { 'd.a': existing + 1 } }, upsert=False, multi=False) 

对于pymongo版本> = 3.0

 db.ProductData.update_one({ '_id': p['_id'] },{ '$set': { 'd.a': existing + 1 } }, upsert=False) 

但是,如果您只需要增加值,那么当多个请求可以同时运行时,这种方法可能会引入问题。 相反,你应该使用$ inc语法:

对于pymongo版本<3.0:

 db.ProductData.update({ '_id': p['_id'] },{ '$inc': { 'd.a': 1 } }, upsert=False, multi=False) 

对于pymongo版本> = 3.0:

 db.ProductData.update_one({ '_id': p['_id'] },{ '$inc': { 'd.a': 1 } }, upsert=False) 

这确保您的增量将始终发生。

用我的pymongo版本:3.2.2我做了以下

 from bson.objectid import ObjectId import pymongo client = pymongo.MongoClient("localhost", 27017) db = client.mydbname db.ProductData.update_one({ '_id': ObjectId(p['_id']) },{ '$set': { 'd.a': existing + 1 } }, upsert=False)