2013-08-21 6 views
3

Nous sommes en train de refactoriser une base de données mongo, et j'aimerais extraire la valeur d'un champ et le placer dans un tableau de hachage dans un autre champ. Voici comment les données se regarde dans le document avant:Déplacer un champ mongo dans un document s'il existe

basecampURL: "https://basecamp.com/123/", 
trackingSystems: [ 
    { 
     type: "github", 
     url: "https://github.com/org/repo/issues/" 
    } 
] 

Et voici ce que j'espère accomplir:

trackingSystems: [ 
    { 
     type: "basecamp", 
     url: "https://basecamp.com/123/" 
    }, 
    { 
     type: "github", 
     url: "https://github.com/org/repo/issues/" 
    } 
] 

J'ai essayé quelques variations de ce code, et où je Je rencontre un problème lorsque je référence la variable trouvée pour basecampURL, tous les exemples sur MongoDB Update utilisent une chaîne.

db.projects.update( 
    { basecampURL: '.+' }, 
    { $push: 
     { trackingSystems: 
      { 
       type: 'basecamp', 
       url: basecampURL // this isn't valid, also tried $.basecampURL 
      } 
     }, 
     $unset: 
     { basecampURL: '.+' } 
    }, 
    { multi: true} 
) 

Il semble que je ne suis pas trouver comment référencer les propriétés de l'élément trouvé, mais je me demandais si je dois faire enregistrer la variable trouvée avant la mise à jour.

Répondre

4

Vous pouvez y parvenir en utilisant une fonction javascript similaire à ceci:

db.coll.find({basecampURL : {$exists : true}}).forEach(
    function(doc) { 
     var bc = {}; 
     bc.type = "basecamp"; 
     bc.url = doc.basecampURL; 
     doc.trackingSystems.push(bc); 
     // deletes the previous value 
     delete doc.basecampURL; 
     db.coll.save(doc); 
    } 
) 
+0

brillant. Merci @orid. Je me grattais la tête sur celui-là. Mis à jour pour également supprimer le champ d'origine basecampURL. – brock

Questions connexes