Как обновить значения с помощью pymongo?
у меня есть коллекция mongodb в этой форме:
{id=ObjectId(....),key={dictionary of values}}
where dictionary of values is {'a':'1','b':'2'.....}
пусть словарь значений будет 'd'
.
Мне нужно обновить значения ключа в 'd'
.
Я. e я хочу изменить 'a':'1'
to '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)
3 ответов
вы можете использовать синтаксис $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)
однако, если вам просто нужно увеличить значение, этот подход может привести к проблемам, когда несколько запросов могут выполняться одновременно. Вместо этого вы должны использовать синтаксис $Инк:
для версий 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)
Это гарантирует, что ваши приращения всегда будут происходить.
С моей версией 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)
в python операторы должны быть в кавычках: децибел.ProductData.update ({'fromAddress':'http://localhost:7000/'}, {"$set": {'fromAddress':'http://localhost:5000/'}}, {"multi": True})