sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualizar una matriz usando MongoDB

El método save() está fallando porque está intentando insertar el siguiente documento en la colección:{"$push":{"resources":[una lista de recursos]}}, y "$push" no es una clave válida nombre.

Según su pregunta, parece que está intentando agregar otro documento de recursos a la lista de documentos incrustados, "recursos", dentro del documento incrustado que coincide con {"itemID":"1"}, dentro de "itemList". ¿Es esto correcto?

Tratar con capas de documentos incrustados es complicado, pero se puede hacer:
Así es como se puede insertar el siguiente documento en la lista de "recursos" usando el shell JS:

> var docToInsert = { "resourceID" : "3", "resourceName" : "Foo Test3"}
> db.myCollection.update({_id:"1", "itemList.itemID":"1"}, {"$push":{"itemList.$.resources":docToInsert}})
> db.myCollection.find().pretty()
{
    "_class" : "com.model.Test",
    "_id" : "1",
    "itemList" : [
        {
            "itemID" : "1",
            "itemName" : "Foo",
            "resources" : [
                {
                    "resourceID" : "1",
                    "resourceName" : "Foo Test1"
                },
                {
                    "resourceID" : "2",
                    "resourceName" : "Foo Test2"
                },
                {
                    "resourceID" : "3",
                    "resourceName" : "Foo Test3"
                }
            ]
        }
    ]
}
> 

La documentación sobre el uso del operador posicional "$" para actualizar documentos incrustados se puede encontrar en la documentación de "Actualización":http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

La documentación sobre el modificador "$push" también se encuentra en la página "Actualización":http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

Del código publicado, parece que "recursos" es una lista. Es posible que el método que necesite usar sea $pushAll, usado para agregar múltiples valores a una lista:http://www.mongodb.org/display/DOCS/Updating#Actualización-%24pushAll

Usando el controlador Java, la inserción anterior se puede hacer así:

Mongo m = new Mongo("localhost", 27017);
DB db = m.getDB("test");
DBCollection myColl = db.getCollection("myCollection");

BasicDBObject docToInsert = new BasicDBObject("resourceID", "3");
docToInsert.put("resourceName", "Foo Test3");

BasicDBObject updateQuery = new BasicDBObject("_id", "1");
updateQuery.put("itemList.itemID", "1");

BasicDBObject updateCommand = new BasicDBObject("$push", new BasicDBObject("itemList.$.resources", docToInsert));

myColl.update(updateQuery, updateCommand);
System.out.println(myColl.findOne().toString());

Lo anterior genera lo siguiente:

{ "_class" : "com.model.Test" , "_id" : "1" , "itemList" : [ { "itemID" : "1" , "itemName" : "Foo" , "resources" : [ { "resourceID" : "1" , "resourceName" : "Foo Test1"} , { "resourceID" : "2" , "resourceName" : "Foo Test2"} , { "resourceID" : "3" , "resourceName" : "Foo Test3"}]}]}

Con suerte, lo anterior mejorará su comprensión de cómo funciona la actualización de un documento incrustado con Mongo usando el controlador Java. Noté que esta pregunta también está relacionada con Spring ("mongoOperations" es una clase del paquete Spring), con el que lamentablemente no estoy familiarizado. Si aún tiene problemas con su actualización, tal vez otro miembro de la comunidad que esté más familiarizado con Spring pueda ayudarlo.