Как обновить значения с помощью 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})