1. ホーム
  2. python

pymongoを使って値を更新するには?

2023-11-05 15:33:20

質問

このフォームにmongodbのコレクションを持っています。

{id=ObjectId(....),key={dictionary of values}}
where dictionary of values is {'a':'1','b':'2'.....}

値の辞書を 'd' . のキーの値を更新する必要があります。 'd' . すなわち、私は 'a':'1''a':'2' pymongoでこれを行うにはどうしたらよいでしょうか?

コードはこのような感じです。

productData is a collection in mongoDB
for p in productData.find():
     for k,v in p.iteritems():
         value=v['a']
         value=value+1
         v['a']=value

ここで、productDataに新しい値を反映させます。

これは私が試したもので、新しいキーと値のペアを導入し、更新する代わりに

for p in productData.find():
    for k,v in p.iteritems():
         value=v['a']
         value=value+1
         v['a']=value
         productData.update({'_id':mongoId},{"$set":{'d.a':'100'}},upsert=False)

どのように解決するのですか?

ドキュメントの値を任意の値に設定したい場合、$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)

これにより、インクリメントが必ず発生するようになります。