Подтвердить что ты не робот

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

Ответ 1

Вы можете использовать синтаксис $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)

Это гарантирует, что ваши приращения всегда будут выполняться.

Ответ 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'])
},{
  '$set': {
    'd.a': existing + 1
  }
}, upsert=False)