Ответ 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)
Это гарантирует, что ваши приращения всегда будут выполняться.