2016-12-15 1 views
0

J'essaie d'utiliser une valeur de variable comme nom de colonne pour mettre à jour tous mes documents dans une collection. J'essaye ceci par la commande de coquille de robo mongo. Code est ci-dessous:comment utiliser la variable dans l'instruction de mise à jour - MongoDB

doc=db.Symbols.findOne(); 
for (key in doc) 
{ 
db.getCollection('Symbols').update(
    { key : null }, 
    { 
     $set: { key: ""} 
    }, 
    { multi: true, upsert: false } 
) 
    } 

mais ce code ne semble fonctionner pour moi. semble que la valeur dans la variable "clé" ne remplace pas à l'exécution et au lieu de comparer avec la valeur dans la clé variable robo mongo le comparer avec le mot "clé" lui-même. Une idée de comment faire cela?

+0

Avez-vous vérifié ** [rename $] (https://docs.mongodb.com/manual/reference/operator/update/rename/) * * – Yogesh

+0

@ yogesh- mon souci n'est pas de changer le nom de la colonne mais de mettre à jour toutes les valeurs de colonne qui contiennent null avec une chaîne vide. – shobhit

+0

Ceci est une chose javascript, il traite 'key' comme chaîne littérale. Vous devez former les tableaux à l'extérieur manuellement comme 'crtiera [key] = null' et ensuite l'utiliser – Sammaye

Répondre

0

Vous avez besoin d'un mécanisme qui parcourt toute la collection et à chaque itération, vérifiez pour chaque champ dans un document pour null, et mettez à jour la collection en conséquence. Une approche de base suit:

db.Symbols.find({}).forEach(function(doc){ 
    var update = { "$set": { } }, 
     query = {}; 
    for (var key in doc) { 
     if (doc[key] === null) { 
      update["$set"][key] = ""; 
      query[key] = { "$exists": false } 
     }    
    } 
    if (Object.keys(query).length !=== 0) 
     db.Symbols.updateOne(query, update);   

}); 

Pour les collections très faramineux, vous pouvez tirer parti de vos mises à jour pour être plus efficace avec l'API vrac qui peut mettre à jour votre collection en vrac au lieu d'envoyer la demande de mise à jour par document, ainsi rendre les mises à jour un peu plus rapides et plus performantes. L'exemple suivant illustre cela avec la méthode bulkWrite():

var ops = []; 

db.Symbols.find({}).forEach(function(doc){ 
    var update = { "$set": { } }, 
     query = {}; 
    for (var key in doc) { 
     if (doc[key] === null) { 
      update["$set"][key] = ""; 
      query[key] = { "$exists": false } 
     }    
    } 
    if (Object.keys(query).length !=== 0) { 
     ops.push({ 
      "updateOne": { 
       "filter": query, 
       "update": update 
      } 
     }); 
    } 


    // Send to server in batches of 500 operations only 
    if (ops.length % 1000 === 0) { 
     db.Symbols.bulkWrite(ops); 
     ops = []; 
    } 
}) 

// Clear remaining queue 
if (ops.length > 0) 
    db.Symbols.bulkWrite(ops);