2013-03-07 21 views
5

Próbuję usunąć atrybut z potrójnie zagnieżdżonej tablicy bez powodzenia. Oto przykład danych Chcę usunąć:MongoDb: Jak wyzerować atrybut z zagnieżdżonych tablic?

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

] 

Próbowałem następujące zapytania aktualizacji, ale żaden z nich nie pracował:

  • 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);)

Jednak jeśli wykonam db.Page.find('Controls.Submit.Executes.Type': { $exists : true } }) i t zwraca wszystkie Executy, które wciąż mają atrybut Type.

Czy można to osiągnąć? Dzięki!

+0

Twój 'Executes' wydaje się być przedmiotem, a nie tablicą. – madhead

+0

masz rację, źle to napisałem ... proszę, spójrz na to teraz! – faloi

Odpowiedz

4

zapytań oraz aktualizacji zagnieżdżonych tablic nie jest (jeszcze) wspierany przez MongoDB poleceń bezpośrednio, to musi być wykonywane po stronie klienta:

  • odczytać dokument do zmiennej
  • manipulować tablicę
  • aktualizacji dokumentu, przepisywanie całą tablicę

Zobacz ten problem na Jira: https://jira.mongodb.org/browse/SERVER-831 i ten wątek na stackoverflow: Mongo update of subdocs

Biorąc swój przykład, będzie to wyglądać tak:

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}}); 
}); 

a wynik jest:

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