2010-08-26 31 views
8

Suponiendo que tengo la siguiente estructura del documento:¿Cómo actualizar un objeto en matrices anidadas en mongo db?

{ 
    "name": "myProduct", 
    "perspectives" : [ 
     { 
      "name": "p1", 
      "views" : [ 
       { 
        "name": "v1" 
       }, 
       { 
        "name": "v2" 
       } 
      ] 
     }, 
     { 
      "name": "p2", 
      "views" : [ 
       { 
        "name": "v1" 
       }, 
       { 
        "name": "v2" 
       } 
      ] 
     } 
    ] 
} 

¿Cómo hago para actualizar la estructura del documento para agregar un campo "alias" para cada uno de los puntos de vista?

Básicamente estoy buscando hacer algo como perspective.views.alias: "av1" para todas las perspectivas.vistas.nombre: "v1".

La estructura resultante se vería así:

{ 
    "name": "myProduct", 
    "perspectives" : [ 
     { 
      "name": "p1", 
      "views" : [ 
       { 
        "name": "v1", 
        "alias": "av1" 
       }, 
       { 
        "name": "v2", 
        "alias": "av2" 
       } 
      ] 
     }, 
     { 
      "name": "p2", 
      "views" : [ 
       { 
        "name": "v1", 
        "alias": "av1" 
       }, 
       { 
        "name": "v2", 
        "alias": "av2" 
       } 
      ] 
     } 
    ] 
} 

Para aclarar, me gustaría hacer algo como esto:

foreach (view in product.perspectives.views) 
{ 
    if (view.name == "p1") 
     view.add("alias", "av1"); 
} 
+0

¿No puede extraer los datos con el idioma que esté utilizando, recorrerlos como lo hace en la parte inferior y actualizarlos? ¿O estás tratando de hacerlo en una sola consulta? Si este es el caso, mira esto: http://www.mongodb.org/display/DOCS/Server-side+Code+Execution –

+0

Gracias Shane! Sí, lo hago desde la consola como scripts en lugar de hacerlo desde una aplicación y un lenguaje de nivel superior (como Java, por ejemplo). Aunque podría seguir la ruta de la aplicación si resulta ser más fácil/más productivo. – longda

Respuesta

15

que tendrá que bucle, aunque sus documentos, la perspectivas en cada documento y las opiniones en cada perspectiva. Luego actualice las vistas y guarde el documento actualizado. Algo como esto debería hacer el truco:

db.products.find().forEach(function (product) { 
    product.perspectives.forEach(function (perspective) { 
    perspective.views.forEach(function (view) { 
     view.alias = "a" + view.name; 
    }) 
    }); 

    db.products.save(product); 
}) 

Puede pegar esta función en el armazón de Mongo y ejecutarlo desde allí. Como alternativa, se puede guardar en un archivo llamado updateProducts.js y ejecutar el archivo con la consola mongo:

mongo nameOfDatabase updateProducts.js 

La función se ejecutará en el servidor, por lo que debe ser bastante rápido.

+0

Bien, lo intentaré ... ¡gracias! – longda

+0

¡Eso funciona! Eres un dios! :) – longda

+0

@longda: Me alegro de poder ayudar :) –

Cuestiones relacionadas