Vous pouvez utiliser la syntaxe $set si vous souhaitez définir la valeur d'un document sur une valeur arbitraire. Cela mettra à jour la valeur si l'attribut existe déjà sur le document ou le créera s'il n'existe pas. Si vous avez besoin de définir une seule valeur dans un dictionnaire comme vous le décrivez, vous pouvez utiliser la notation par points pour accéder aux valeurs enfants.
Si p est l'objet récupéré :
existing = p['d']['a']
Pour les versions de pymongo < 3.0
db.ProductData.update({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False, multi=False)
Pour les versions de pymongo>=3.0
db.ProductData.update_one({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False)
Cependant, si vous avez juste besoin d'incrémenter la valeur, cette approche peut introduire des problèmes lorsque plusieurs requêtes peuvent être exécutées simultanément. À la place, vous devez utiliser la syntaxe $inc :
Pour les versions de pymongo < 3.0 :
db.ProductData.update({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False, multi=False)
Pour les versions de pymongo >= 3.0 :
db.ProductData.update_one({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False)
Cela garantit que vos incréments se produiront toujours.