2012-04-26 17 views
6

Tengo el siguiente objeto en mi base de datos mongo llamado música.

Quiero actualizar donde el género es de Grunge
El nombre de la banda es el Nirvana
El nombre del álbum es No importa
El orden de las pistas es 1

Actualización de MongoDB Deep Array

y cambiar el nombre de la pista de "Smells Like Teen Spirit ! ".
He intentado jugar con el operador de posición, pero no puedo resolver esto.

{ 
    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

¿Ha considerado cambiar un poco el diseño de su base de datos? Tendría más sentido si tu documento fuera una "banda" con un atributo de "género", y también facilitaría mucho esta consulta en particular. – Russell

+0

Este fue solo el ejemplo más rápido que pude pensar. Si tuviera que hacer una base de datos de "música", probablemente establecería canciones como el elemento raíz con artistas, álbumes y géneros como matrices; permitiendo cosas como David Bowie/Queen's 'Under Pressure' (2 artistas, álbumes múltiples). – JWally

Respuesta

9

Lamentablemente, en este momento solo es posible usar un solo "$" posicional por actualización. Esto limita la actualización a una sola matriz incrustada, similar al ejemplo en la documentación: http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator (De su publicación, parece que ya ha encontrado esto, pero he incluido el enlace para el beneficio de cualquier otro usuario que lea esta publicación .)

Para realizar la actualización, deberá conocer la posición de dos de los tres siguientes: La posición de la banda en la matriz de "bandas", la posición del álbum en la matriz de álbumes, o la posición de la pista en la matriz de "pistas".

Hay una función de solicitud para esta funcionalidad, y está programada para la versión 2.3.0 (aunque está sujeta a cambios).
https://jira.mongodb.org/browse/SERVER-831 "posicional operador de coincidencia anidadas Arrays"

por el momento, tendrá que conocer la posición de los documentos sub en dos de las tres matrices:

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

Parece que rompieron la compatibilidad con versiones anteriores en la versión 2.6.x. Obtengo "El operador posicional no encontró la coincidencia necesaria de la consulta" para su segundo ejemplo (mongodb 2.6.4). funciona bien en versiones anteriores. – bersam

+3

Es un error y lo aprueban, esta respuesta ya no es válida en mongoDB 2.6 https://jira.mongodb.org/browse/SERVER-14886 – bersam

Cuestiones relacionadas