ドキュメントの値を任意の値に設定する場合は、$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)
これにより、増分が常に発生します。