75

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

4 回答 4

129

如果要将文档的值设置为任意值,可以使用 $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 语法:

对于 < 3.0 的 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)

这确保您的增量将始终发生。

于 2012-12-04T20:11:47.307 回答
9

使用我的 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)
于 2016-03-29T04:19:59.607 回答
1

我最近做了一些事情,希望对你有帮助。我有一个字典列表,想为一些现有文档添加一个值。

for item in my_list:
    my_collection.update({"_id" : item[key] }, {"$set" : {"New_col_name" :item[value]}})
于 2019-11-05T15:30:05.140 回答
0

在 Python 中,运算符(例如,$set)应该用引号引起来:

db.ProductData.update(
    {'fromAddress': 'http://localhost:7000/'},
    {'$set': {'fromAddress': 'http://localhost:5000/'}},
    {'multi': True}
)
于 2018-07-05T16:14:56.673 回答