web-dev-qa-db-fra.com

Comment mettre à jour les valeurs en utilisant pymongo?

J'ai une collection mongodb sous cette forme:

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

Laisser le dictionnaire de valeurs être 'd'. Je dois mettre à jour les valeurs de la clé dans le 'd'. c'est-à-dire que je veux changer 'a':'1' à 'a':'2' Comment puis-je faire cela en pymongo?

Le code ressemble à ceci:

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

Maintenant, reflétez la nouvelle valeur dans le productData.

C’est ce que j’ai essayé et introduit une nouvelle paire clé-valeur au lieu de mettre à jour le

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

Vous pouvez utiliser la syntaxe $ set si vous souhaitez définir la valeur d'un document sur une valeur arbitraire. Cela mettra à jour la valeur si l'attribut existe déjà dans le document ou le créera s'il ne l'est pas. Si vous devez définir une valeur unique dans un dictionnaire, comme vous le décrivez, vous pouvez utiliser la notation par points pour accéder aux valeurs enfant.

Si p est l'objet récupéré:

existing = p['d']['a']

Pour les versions de pymongo <3.0

db.ProductData.update({
  '_id': p['_id']
},{
  '$set': {
    'd.a': existing + 1
  }
}, upsert=False, multi=False)

Pour les versions de pymongo> = 3.0

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

Toutefois, si vous devez simplement incrémenter la valeur, cette approche peut générer des problèmes lorsque plusieurs demandes peuvent être exécutées simultanément. Au lieu de cela, vous devriez utiliser la syntaxe $ inc:

Pour les versions de pymongo <3.0:

db.ProductData.update({
  '_id': p['_id']
},{
  '$inc': {
    'd.a': 1
  }
}, upsert=False, multi=False)

Pour les versions de pymongo> = 3.0:

db.ProductData.update_one({
  '_id': p['_id']
},{
  '$inc': {
    'd.a': 1
  }
}, upsert=False)

Cela garantit que vos augmentations se produiront toujours.

99
Mark Unsworth

Avec ma version pymongo: 3.2.2 je devais faire ce qui suit

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