如何使用pymongo更新值?

时间:2012-12-04 19:50:33

标签: python mongodb 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中的新值。

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

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 个答案:

答案 0 :(得分:96)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

我最近做过的事情,希望对您有所帮助。我有一个词典列表,想在现有文档中添加一个值。

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

答案 3 :(得分:-1)

在python中,运算符应用引号引起来: db.ProductData.update({'fromAddress':'http://localhost:7000/'},{“ $ set”:{'fromAddress':'http://localhost:5000/'}},{“ multi”:True})< / p>