python - 如何使用 pymongo 更新值?

我有一个这种形式的 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/

相关文章:

javascript - 在 JavaScript 中将 ObjectID (Mongodb) 转换

python - Pymongo/MongoDB : create index or ensure

node.js - 如何使用 Node.js 在 MongoDB 中使用 cursor.forEac

java - MongoDB中不区分大小写的排序

mongodb - 如何发现 mongodb 数据库结构

mongodb - 修改和重放 MongoDB oplog

mongodb - mongodb insert 命令中是否有 "upsert"选项?

mongodb - 在 MongoDB 中查找具有不包含具有特定字段值的文档的数组的文档

python - 哪个 Python API 应该与 Mongodb 和 Django 一起使用

node.js - Mongoose 填充与对象嵌套