我有一个mongodbCollection ,形式如下:

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

让价值字典为'd'.

代码是这样的:

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中反映新的值.

这就是我try 过的,它引入了一个新的键值对,而不是更新

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']

For pymongo versions < 3.0

db.ProductData.update({
  '_id': p['_id']
},{
  '$set': {
    'd.a': existing + 1
  }
}, upsert=False, multi=False)

For pymongo versions >= 3.0

db.ProductData.update_one({
  '_id': p['_id']
},{
  '$set': {
    'd.a': existing + 1
  }
}, upsert=False)

但是,如果只需要增加值,这种方法可能会在多个请求同时运行时带来问题.相反,您应该使用$inc语法:

For pymongo versions < 3.0:

db.ProductData.update({
  '_id': p['_id']
},{
  '$inc': {
    'd.a': 1
  }
}, upsert=False, multi=False)

For pymongo versions >= 3.0:

db.ProductData.update_one({
  '_id': p['_id']
},{
  '$inc': {
    'd.a': 1
  }
}, upsert=False)

这确保了你的增量总是会发生.

Mongodb相关问答推荐

在MogoDB中按时间间隔分组、统计文档和获取间隔时间

在MongoDB集合中按文档内的频率对数组排序

如何向所有文档添加一个字段,其中前 100 个文档的值为 1,接下来的 100 个文档的值为 2,依此类推?

如何判断 MongoDB 的两个数组中是否存在值?

MongoDB shell:如何删除列表以外的所有集合

Mongoose 返回包含属性内任何位置的值的所有文档

_id 和 $oid 的区别; mongo 数据库中的 $date 和 IsoDate

创建索引需要很长时间

mongo.lock 文件有什么用?

具有最佳插入/秒性能的数据库?

MongoDB 是否重用已删除的空间?

mongodb 中的 --bindip 配置选项有什么作用?

使用 ObjectId.GenerateNewId() 还是离开 MongoDB 创建一个?

Mongoose.js 通过一个 connect() 调用创建到 MongoDB 的多个连接

使用已排序的数据获取不同的值

java.lang.IncompatibleClassChangeError:Implementing class Mongo

从每个组中 Select 前 N 行

MongoDB 数据库,相当于 SELECT column1, column2 FROM tbl

试图从 mongoose 获取Collection 列表

mongoose查询返回 null