web-dev-qa-db-ja.com

pymongoを使用して値を更新する方法は?

私はこの形式の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)
49
gizgok

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

これにより、増分が常に発生します。

99
Mark Unsworth

私のpymongoバージョンで:3.2.2私は次のことをしました

from bson.objectid import ObjectId
import pymongo

client = pymongo.MongoClient("localhost", 27017)
db = client.mydbname

db.ProductData.update_one({
  '_id': ObjectId(p['_id']['$oid'])
},{
  '$set': {
    'd.a': existing + 1
  }
}, upsert=False)
4
Raptor