如何使用 pymongo 更新值?

Posted

技术标签:

【中文标题】如何使用 pymongo 更新值?【英文标题】:How to update values using pymongo? 【发布时间】:2012-11-22 13:02:15 【问题描述】:

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

【问题讨论】:

重复***.com/questions/4372797/… 更新现有字段是否同样适用? 可以肯定,是的。试试看会发生什么。 对于一个您应该执行“for k,v in p['d'].iteritems()”的人 - 此外,Mark 在下面的回答确实可以在不创建新的键/值对的情况下工作。您应该发布更多代码,以便我们看到您做错了什么。 【参考方案1】:

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

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

【讨论】:

这引入了一个新的键值对 $set$inc 部分的两个更新语句中都缺少 $set 应该被引用:'$set'。否则会抛出语法错误。【参考方案2】:

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

【讨论】:

面临 TypeError 异常值:'ObjectId' 类型的对象在 django1.11 上不是 JSON 可序列化【参考方案3】:

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

db.ProductData.update(
    'fromAddress': 'http://localhost:7000/',
    '$set': 'fromAddress': 'http://localhost:5000/',
    'multi': True
)

【讨论】:

【参考方案4】:

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

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

【讨论】:

DeprecationWarning: update is deprecated. Use replace_one, update_one or update_many instead.

以上是关于如何使用 pymongo 更新值?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 pymongo

如何使用 html、pymongo 中的按钮更新 mongodb

如何使用 python mongodb 客户端库(pymongo)更新 mongodb 集合中所有文档的字段“类型”

如何使用 pymongo 获取第一个和最后一个日期值

如何使用 pymongo 将新的值数组附加到 mongodb 中的现有数组文档?

如何使用 pymongo 在 mongodb 中重命名父字段名称和嵌套字段值?