Você pode usar a sintaxe $set se quiser definir o valor de um documento para um valor arbitrário. Isso atualizará o valor se o atributo já existir no documento ou o criará se não existir. Se você precisar definir um único valor em um dicionário como você descreve, você pode usar a notação de ponto para acessar os valores filho.
Se p é o objeto recuperado:
existing = p['d']['a']
Para versões do pymongo <3.0
db.ProductData.update({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False, multi=False)
Para versões do pymongo>=3.0
db.ProductData.update_one({
'_id': p['_id']
},{
'$set': {
'd.a': existing + 1
}
}, upsert=False)
No entanto, se você precisar apenas incrementar o valor, essa abordagem poderá apresentar problemas quando várias solicitações puderem ser executadas simultaneamente. Em vez disso, você deve usar a sintaxe $ inc:
Para versões do pymongo <3.0:
db.ProductData.update({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False, multi=False)
Para versões do pymongo>=3.0:
db.ProductData.update_one({
'_id': p['_id']
},{
'$inc': {
'd.a': 1
}
}, upsert=False)
Isso garante que seus incrementos sempre aconteçam.