如何使用 pymongo 更新值?

我收集了一些这样的东西:

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

设值字典为 'd'。 我需要更新 'd'中的键值。 我想把 'a':'1'改成 'a':'2' 我怎么能这样在平芒果?

代码是这样的:

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)
151645 次浏览

如果希望将文档的值设置为任意值,可以使用 $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)

这样可以确保您的增量总是会发生。

使用我的 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)

在 Python 中,操作符(例如 $set)应该加引号:

db.ProductData.update(
{'fromAddress': 'http://localhost:7000/'},
{'$set': {'fromAddress': 'http://localhost:5000/'}},
{'multi': True}
)

我最近做的一件事,希望能有所帮助。我有一个字典列表,希望为一些现有文档增加一个值。

for item in my_list:
my_collection.update({"_id" : item[key] }, {"$set" : {"New_col_name" :item[value]}})