2013-03-07 10 views
5

Sto tentando di rimuovere un attributo da un array a triplo nidificazione senza successo. Ecco un esempio dei dati Voglio rimuovere:MongoDb: come annullare l'attributo dagli array annidati?

Controls: [ 
    {  
     Name: 'ControlNumberOne', 
     Submit: { 
      Executes: [ 
       { 
        Name: 'execute', 
        Type: 0 
       }, 
       { 
        Name: 'anotherExecute', 
        Type: 0 
       } 
      ] 
     } 
    }, 
    {  
     Name: 'ControlNumberTwo', 
     Submit: { 
      Executes: [ 
       { 
        Name: 'anotherFromAnotherControl', 
        Type: 1 
       } 
      ] 
     } 
    } 

] 

ho provato la seguente query di aggiornamento, ma nessuno di loro ha lavorato:

  • db.Page.update('Controls.Submit.Executes.Type': { $exists : true } }, { $unset : { 'Controls.Submit.Executes.Type' : 1 } }, false, true);)

  • db.Page.update('Controls.Submit.Executes.Type': { $exists : true } }, { $unset : { 'Controls.$.Submit.Executes.$.Type' : 1 } }, false, true);)

Tuttavia, se eseguo db.Page.find('Controls.Submit.Executes.Type': { $exists : true } }) i t restituisce tutti gli Executes che hanno ancora un attributo Type.

Questo obiettivo può essere raggiunto? Grazie!

+0

vostro 'Executes' sembra essere un oggetto, non un array. – madhead

+0

hai ragione, l'ho messo in pericolo ... per favore dai un'occhiata ora! – faloi

risposta

4

interrogazione e aggiornamento di matrici nidificate non è (ancora) supportato da MongoDB comandi direttamente, questo deve essere fatto sul lato client:

  • leggere il documento in una variabile
  • manipolare l'array
  • aggiornamento del documento, riscrivendo l'intero array

Visualizza questo problema in Jira: https://jira.mongodb.org/browse/SERVER-831 e questa discussione su StackOverflow: Mongo update of subdocs

dato il tuo esempio, questo sarebbe simile a questa:

db.xx.find(
    {'Controls.Submit.Executes.Type': { $exists : true } } 
).forEach(function(doc) { 
    doc.Controls.forEach(function(c) { 
     c.Submit.Executes.forEach(function(e) { 
      if (e.Type != undefined) delete e.Type;   
     }); 
    }); 
    db.xx.update({_id: doc._id},{$set:{Controls:doc.Controls}}); 
}); 

e il risultato è:

> db.xx.findOne() 
{ 
    "Controls" : [ 
     { 
      "Name" : "ControlNumberOne", 
      "Submit" : { 
       "Executes" : [ 
        { 
         "Name" : "execute" 
        }, 
        { 
         "Name" : "anotherExecute" 
        } 
       ] 
      } 
     }, 
     { 
      "Name" : "ControlNumberTwo", 
      "Submit" : { 
       "Executes" : [ 
        { 
         "Name" : "anotherFromAnotherControl" 
        } 
       ] 
      } 
     } 
    ], 
    "_id" : ObjectId("5159ff312ee0f7d445b03f32") 
}