2017-08-23 2 views
0

J'ai beaucoup de documents dans une collection. La structure de chacun des documents à l'intérieur de la collection est comme suit:multi mise à jour une clé le long des documents d'une collection en utilisant pymongo

{ 
"_id" : ObjectId(....), 
"valor" : { 
    "AB" : { 
     "X" : 0.0, 
     "Y" : 142.6, 
    }, 
    "FJ" : { 
     "X" : 0.2, 
     "Y" : 3.33 

.... 

La collection compte actuellement environ 200 documents et je l'ai remarqué que l'une des clés à l'intérieur valor a le mauvais nom. Dans ce cas, nous dirons que "FJ" sera "JOF" dans tous les documents de la collection.

Je suis assez sûr qu'il est possible de changer la clé dans tous les docs en utilisant la fonction update de pymongo. Le problème auquel je suis confronté est que lorsque je visite le document en ligne disponible https://docs.mongodb.com/v3.0/reference/method/db.collection.update/ explique seulement comment changer les valeurs (que je voudrais rester comme elles sont actuellement et ne changer que les clés).

Voici ce que j'ai essayé:

def multi_update(spec_key,key_updte): 
    rdo=col.update((valor.spec_key),{"$set":(valor.key_updte)},multi=True) 
    return rdo 

print(multi_update('FJ','JOF')) 

Mais sorties name 'valor' is not defined. Je pensais que je devrais utiliser valor.specific_key pour accéder au json correspondant

comment puis-je mettre à jour une clé seulement le long des docs de la collection?

Répondre

0

Vous avez deux problèmes. Premièrement, valor n'est pas un identifiant dans votre code Python, c'est un nom de champ d'un document MongoDB. Vous devez le citer en guillemets simples ou doubles en Python pour en faire une chaîne et l'utiliser dans une expression de mise à jour de PyMongo.

Votre deuxième problème est que la commande update de MongoDB ne vous permet pas de définir un champ à la valeur d'un autre, ni de renommer un champ. Toutefois, vous pouvez remodeler tous les documents de votre collection à l'aide de la commande aggregate avec une scène $project et stocker les résultats dans une deuxième collection à l'aide d'une scène $out.

Voici un exemple complet pour jouer avec:

db = MongoClient().test 
collection = db.collection 
collection.delete_many({}) 
collection.insert_one({ 
"valor" : { 
    "AB" : { 
     "X" : 0.0, 
     "Y" : 142.6, 
    }, 
    "FJ" : { 
     "X" : 0.2, 
     "Y" : 3.33}}}) 

collection.aggregate([{ 
    "$project": { 
     "valor": { 
      "AB": "$valor.AB", 
      "FOJ": "$valor.FJ" 
     } 
    } 
}, { 
    "$out": "collection2" 
}]) 

Ceci est la partie dangereuse. D'abord, vérifiez que "collection2" a tous les documents que vous voulez, dans la forme désirée. Puis:

collection.drop() 
db.collection2.rename("collection") 

import pprint 
pprint.pprint(collection.find_one())