È possibile utilizzare la sintassi $set se si desidera impostare il valore di un documento su un valore arbitrario. Questo aggiornerà il valore se l'attributo esiste già nel documento o lo creerà in caso contrario. Se devi impostare un singolo valore in un dizionario come quello che descrivi, puoi utilizzare la notazione con il punto per accedere ai valori figlio.
Se p è l'oggetto recuperato:
existing = p['d']['a']
Per le versioni pymongo <3.0
db.ProductData.update({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False, multi=False)
Per versioni pymongo>=3.0
db.ProductData.update_one({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False)
Tuttavia, se hai solo bisogno di incrementare il valore, questo approccio potrebbe introdurre problemi quando più richieste potrebbero essere eseguite contemporaneamente. Invece dovresti usare la sintassi $inc:
Per le versioni di pymongo <3.0:
db.ProductData.update({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False, multi=False)
Per le versioni pymongo>=3.0:
db.ProductData.update_one({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False)
Ciò garantisce che i tuoi incrementi avvengano sempre.