75

私はこの形式でmongodbコレクションを持っています:

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

値の辞書を とする'd'。のキーの値を更新する必要があります'd'。つまり 、pymongoでこれを行うにはどうすればよいですか'a':'1'?'a':'2'

コードは次のようになります。

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)
4

4 に答える 4

129

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

これにより、増分が常に発生することが保証されます。

于 2012-12-04T20:11:47.307 に答える
9

私の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)
于 2016-03-29T04:19:59.607 に答える