我有一个这种形式的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)
答案 0 :(得分:96)
如果要将文档的值设置为任意值,可以使用$ set语法。如果该属性已存在于文档中,则将更新该值,如果不存在,则创建该属性。如果您需要在描述的字典中设置单个值,则可以使用点表示法来访问子值。
如果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)
这可确保您的增量始终发生。
答案 1 :(得分:4)
用我的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']['$oid'])
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False)
答案 2 :(得分:0)
我最近做过的事情,希望对您有所帮助。我有一个词典列表,想在现有文档中添加一个值。
for item in my_list:
my_collection.update({"_id" : item[key] }, {"$set" : {"New_col_name" :item[value]}})
答案 3 :(得分:-1)
在python中,运算符应用引号引起来: db.ProductData.update({'fromAddress':'http://localhost:7000/'},{“ $ set”:{'fromAddress':'http://localhost:5000/'}},{“ multi”:True})< / p>