如何使用 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 更新值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 html、pymongo 中的按钮更新 mongodb
如何使用 python mongodb 客户端库(pymongo)更新 mongodb 集合中所有文档的字段“类型”