giz*_*gok 49 python mongodb pymongo
我有一个这种形式的mongodb集合:
{id=ObjectId(....),key={dictionary of values}}
where dictionary of values is {'a':'1','b':'2'.....}
Run Code Online (Sandbox Code Playgroud)
让值词典'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
Run Code Online (Sandbox Code Playgroud)
现在反映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)
Run Code Online (Sandbox Code Playgroud)
Mar*_*rth 101
如果要将文档的值设置为任意值,可以使用$ set语法.如果该属性已存在于文档中,则将更新该值,如果不存在,则创建该属性.如果需要在描述的字典中设置单个值,则可以使用点表示法来访问子值.
如果p是检索到的对象:
existing = p['d']['a']
Run Code Online (Sandbox Code Playgroud)
对于pymongo版本<3.0
db.ProductData.update({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False, multi=False)
Run Code Online (Sandbox Code Playgroud)
对于pymongo版本> = 3.0
db.ProductData.update_one({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False)
Run Code Online (Sandbox Code Playgroud)
但是,如果您只需要增加该值,则此方法可能会在多个请求同时运行时引入问题.相反,你应该使用$ inc语法:
对于pymongo版本<3.0:
db.ProductData.update({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False, multi=False)
Run Code Online (Sandbox Code Playgroud)
对于pymongo版本> = 3.0:
db.ProductData.update_one({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False)
Run Code Online (Sandbox Code Playgroud)
这可确保您的增量始终发生.
使用我的 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
96423 次 |
| 最近记录: |