2011-08-19 7 views
2

Je souhaite renommer pour renommer ma clé dict dans mongodb.Comment renommer une clé imbriquée dans mongodb

normalement ça marche comme ça db.update({'_id':id},{$rename:{'oldfieldname':newfieldname}})

Ma structure du document ressemble que

{ 
    'data':'.....', 
    'field':{'1':{'data':....},'2':{'data'...}}, 
    'more_data':'....', 
} 

si je veux mettre un nouveau champ dans le champ 1 i faire db.update({'_id':id},{$set:{'field.0.1.name':'peter'}})

pour le champ deux, il est 'field'.1.2.name'

je pensais avec le renommer il devrait être similaire, mais il est pas ... (comme $rename:{'field'.0.1': 2}

+0

Je ne suis pas tout à fait ce que vous essayez de faire. Pouvez-vous montrer un exemple d'état avant et après? – dcrosta

Répondre

1

Votre question n'est pas claire mais il semble que vous aimeriez renommer un nom de champ dans un tableau.

La réponse courte est que vous ne pouvez pas. Comme indiqué dans le docs, $ rename ne développe pas les tableaux pour trouver un nom correspondant. Cela ne fonctionne que sur les champs de haut niveau. Pour simuler un changement de nom, copiez le champ et ses données dans le nouveau nom, puis supprimez le champ d'origine. Vous pourriez également avoir besoin d'un moyen de rendre compte des écritures potentiellement simultanées si vous avez beaucoup d'écritures sur cet objet/champ.

5

est ici une méthode flexible pour renommer les clés dans une base de données

Compte tenu de la structure du document comme celui-ci ...

{ 
    "_id": ObjectId("4ee5e9079b14f74ef14ddd2f"), 
    "code": "130.4", 
    "description": "4'' Socket Plug", 
    "technicalData": { 
     "Drawing No": "50", 
     "length": "200mm", 
     "diameter: "20mm" 
    }, 
} 

Je veux faire une boucle par tous les documents et renomme TechnicalData [ « Dessin Non »] à TechnicalData [ "dessin numéro"]

Exécutez le javascript suivant dans le panneau en exécution (l'excellent) RockMongo

function remap(x){ 
    dNo = x.technicalData["Drawing No"]; 
    db.products.update({"_id":x._id}, { 
     $set: {"technicalData.Drawing Number" : dNo}, 
     $unset: {"technicalData.Drawing No":1} 
    }); 
} 

db.products.find({"technicalData.Drawing No":{$ne:null}}).forEach(remap); 

Le code sera également dans un shell mongo

+0

Salut Chim, j'aime votre suggestion et j'ai essayé votre code dans le shell mongo, mais il ne cesse de me dire 'ne peut pas ajouter à tableau en utilisant le nom du champ de chaîne [Drawing Number]' je l'ai essayé avec un opérateur positionnel "technicalData. $. Drawing Number": dNo} mais il ne semble pas comprendre l'opérateur de position lorsqu'il est utilisé dans ce contexte. il donne un message de 'ne peut pas ajouter à un tableau en utilisant le nom de champ de chaîne [Numéro de dessin]' avez-vous exécuté ceci dans le shell mongo? – emilebaizel

+0

voici une version nettoyée de mon commentaire précédent. Salut Chim, j'aime votre suggestion et j'ai essayé votre code dans le shell mongo mais il ne cesse de me dire 'ne peut pas ajouter à un tableau en utilisant le nom de champ de chaîne [profileId]'. pouvez-vous jeter un coup d'oeil à mon code ci-dessous et voir si cela semble correct? Merci. fonction remappe (x) { pid = x.readingDataSummaries ["profileId_"]; db.profile.update ({"_id": x._id}, { $ set: {"readingDataSummaries.profileId": pid} }); Db.profile.find ({"_ id": "1b8bfde2-bb6c-4444-b570-9c12f9002c4f"}). PourChaque (remappage); – emilebaizel

+0

J'ai testé à nouveau maintenant et le code comme ci-dessus fonctionne pour moi. mongo v2.02, je pense que je l'ai testé contre v1.8.? précédemment – chim

Questions connexes