Możesz użyć składni $set, jeśli chcesz ustawić wartość dokumentu na dowolną wartość. Spowoduje to zaktualizowanie wartości, jeśli atrybut już istnieje w dokumencie, lub utworzenie go, jeśli tak nie jest. Jeśli potrzebujesz ustawić pojedynczą wartość w słowniku, tak jak opisujesz, możesz użyć notacji z kropkami, aby uzyskać dostęp do wartości podrzędnych.
Jeśli p jest pobranym obiektem:
existing = p['d']['a']
Dla wersji pymongo <3.0
db.ProductData.update({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False, multi=False)
Dla wersji pymongo>=3.0
db.ProductData.update_one({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False)
Jeśli jednak potrzebujesz tylko zwiększyć wartość, to podejście może spowodować problemy, gdy wiele żądań może działać jednocześnie. Zamiast tego powinieneś użyć składni $inc:
Dla wersji pymongo <3.0:
db.ProductData.update({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False, multi=False)
Dla wersji pymongo>=3.0:
db.ProductData.update_one({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False)
Gwarantuje to, że Twoje przyrosty będą miały miejsce zawsze.