我有一个这种形式的 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 中反射(reflect)新值。
这是我尝试过的,它引入了一个新的键值对而不是更新
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 语法。如果属性已存在于文档中,这将更新值,如果不存在,则创建它。如果您需要像您描述的那样在字典中设置单个值,可以使用点符号来访问子值。
如果 p 是检索到的对象:
existing = p['d']['a']
对于 pymongo 版本
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 版本
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)
这可确保您的增量始终发生。
https://stackoverflow.com/questions/13710770/