2012-04-26 28 views
6

Ho il seguente oggetto nel mio database mongo chiamato musica.

voglio aggiornare in cui il genere è Grunge
Il nome della band è il Nirvana
Il nome dell'album è Nevermind
L'ordine pista è 1

MongoDB Aggiornamento Deep Array

e cambiare il nome della traccia a "Smells Like Teen Spirit !".
Ho provato a giocare con l'operatore posizionale, ma non riesco proprio a capire questo .

{ 
    genre : "Grunge", 
    bands : [ { 
     name : "Nirvana", 
     albums : [ { 
      name : "Nevermind", 
      tracks : [ { 
       name : "Smell Like Teen Spirit", 
       order : 1, 
       duration : 301 
      }, 
      { 
       name : "In Bloom", 
       order : 2, 
       duration : 254             
      } ] 
     }, 
     { 
      name : "In Utero", 
      tracks : [ { 
       name : "Server the Servants", 
       order : 1, 
       duration : 216 
      }, 
      { 
       name : "Scentless Apprentice", 
       order : 2, 
       duration : 254             
      } ] 
     } ] 
    }, 
    { 
     name : "Karma++ : A Nirvina Tribute Band", 
     albums : [ { 
      name : "Nevermind", 
      tracks : [ { 
       name : "Smell Like Teen Spirit", 
       order : 1, 
       duration : 301 
      }, 
      { 
       name : "In Bloom", 
       order : 2, 
       duration : 254             
      } ] 
     }, 
     { 
      name : "In Utero", 
      tracks : [ { 
       name : "Server the Servants", 
       order : 1, 
       duration : 216 
      }, 
      { 
       name : "Scentless Apprentice", 
       order : 2, 
       duration : 254             
      } ] 
     } ] 
    } ] 
} 
+0

Hai mai pensato di modificare un po 'il design del tuo DB? Avrebbe forse più senso se il tuo documento fosse una "band" con un attributo "genere" - e renderebbe molto più semplice anche questa particolare query. – Russell

+0

Questo è stato solo l'esempio più veloce a cui potessi pensare. Se dovessi effettivamente creare un database "musicale", probabilmente impostarei le canzoni come elemento principale con artisti, album e generi come array; tenendo conto di cose come "Under Pressure" di David Bowie/Queen (2 artisti, più album). – JWally

risposta

9

Sfortunatamente, al momento è possibile utilizzare un solo posizionamento "$" per aggiornamento. Ciò limita l'aggiornamento a un singolo array incorporato, simile all'esempio nella documentazione: http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator (dal tuo post, sembra che tu abbia già trovato questo, ma ho incluso il link a beneficio di altri utenti che leggono questo post .)

Per eseguire l'aggiornamento, è necessario conoscere la posizione di due dei tre seguenti: La posizione della banda nella matrice "bande", la posizione dell'album nell'array degli album, o la posizione della traccia nella matrice "tracce".

Esiste una richiesta di funzionalità per questa funzionalità ed è prevista per la versione 2.3.0 (sebbene ciò sia soggetto a modifiche).
https://jira.mongodb.org/browse/SERVER-831 "posizionale operatore di corrispondenza array nidificati"

Per il momento, si dovrà conoscere la posizione dei documenti secondari in due delle tre matrici:

db.music.update({genre : "Grunge", "bands.name" : "Nirvana"}, {$set:{"bands.$.albums.0.tracks.0.name":"Smells Like Teen Spirit!"}}) 

db.music.update({genre : "Grunge", "bands.0.albums.name" : "Nevermind"}, {$set:{"bands.0.albums.$.tracks.0.name":"Smells Like Teen Spirit!"}}) 

o

db.music.update({genre : "Grunge", "bands.0.albums.0.tracks.order" : 1}, {$set:{"bands.0.albums.0.tracks.$.name":"Smells Like Teen Spirit!"}}) 
+3

Sembra che abbiano rotto la compatibilità con le versioni precedenti nella versione 2.6.x. Ottengo "L'operatore posizionale non ha trovato la corrispondenza richiesta dalla query" per il tuo secondo esempio (mongodb 2.6.4). funziona bene nelle versioni precedenti. – bersam

+3

È un bug e lo approveranno, questa risposta non è più valida in mongoDB 2.6 https://jira.mongodb.org/browse/SERVER-14886 – bersam