如何使用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)