2014-05-23 13 views
11

Ho un documento ---Come aggiornare il valore di una chiave in un elenco di un JSON in Mongo

Employees:[ 
     { 
      name:"abc", 
      contact:"123", 
      email:"[email protected]" 
     }, 
     { 
      name:"efg", 
      contact:"456", 
      email:"[email protected]" 
     }, 
     { 
      name:"hij", 
      contact:"789", 
      email:"[email protected]" 
     } 
    ] 

ho bisogno di aggiornare il nome con value = "abc" per tutti il ​​nome di chiavi nella lista.

ho cercato di aggiornare come

db.collection.update(
    { "_id" : ObjectId("5308595e3256e758757b4d2f") }, 
    { "$set": { "Employees.name " : "abc" } } 
); 

Ma ottenere l'errore: non può usare la parte (I dipendenti di Employees.name) per attraversare l'elemento.

risposta

29

Questi sono in un array, ecco perché la tua dichiarazione corrente non funziona. Hai alcune opzioni per fare questo in quanto non esiste una semplice dichiarazione per farlo.

1. sai quanti elementi presenti nella matrice, in modo da impostare in modo esplicito con il "dot-notation"

db.collection.update(
     { "_id" : ObjectId("5308595e3256e758757b4d2f") }, 
     { 
      "$set": { 
       "Employees.0.name " : "abc", 
       "Employees.1.name " : "abc", 
       "Employees.2.name " : "abc" 
      } 
     } 
    ); 

2. Tu non sai, ma sono disposti a rilasciare il presente aggiornamento fino a quando i documenti restituiti "modificati" diventa 0. Quindi è possibile utilizzare un posizionale $ operatore l'aggiornamento, ma questo sarà sempre e solo corrispondere un elemento alla volta:

 db.collection.update(
     { 
      "_id" : ObjectId("5308595e3256e758757b4d2f"), 
      "Employees.name": { "$ne": "abc" } 
     }, 
     { 
      "$set": { 
       "Employees.$.name " : "abc" 
      } 
     } 
    ); 

3. recuperare il documento e aggiornare tutti i membri di matrice nel codice:

var doc = db.collection.findOne({ 
     "_id": ObjectId("5308595e3256e758757b4d2f") 
    }); 

    doc.Employee.forEach(function(emp) { 
     emp.name = "abc"; 
    }); 
    db.collection.update(
     { "_id": doc._id }, 
     { "$set": { "Employee": doc.Employeee } } 
    ) 

Questi sono i metodi di base e facendo questo, insieme con qualche esempio pratico del motivo per cui questo non può essere attualmente eseguita in un unico prospetto solo aggiornando ogni campo membro dell'array.

+1

Grazie! Neil il terzo ha risolto il mio problema. Molte grazie! – Shalu

Problemi correlati