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