MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiorna un array usando MongoDB

Il metodo save() non riesce perché sta tentando di inserire il seguente documento nella raccolta:{"$push":{"resources":[a list of resources]}}, e "$push" non è una chiave valida nome.

Dalla tua domanda, sembra che tu stia tentando di aggiungere un altro documento risorsa all'elenco dei documenti incorporati, "risorse", all'interno del documento incorporato corrispondente a {"itemID" :"1"}, all'interno di "itemList". È corretto?

Gestire i livelli di documenti incorporati è complicato, ma può essere fatto:
Ecco come inserire il seguente documento nell'elenco delle "risorse" utilizzando la 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 documentazione sull'utilizzo dell'operatore posizionale "$" per aggiornare i documenti incorporati è disponibile nella documentazione "Aggiornamento":http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

La documentazione sul modificatore "$push" si trova anche nella pagina "Aggiornamento":http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

Dal codice pubblicato, sembra che "risorse" sia un elenco. È possibile che il metodo che devi utilizzare sia $pushAll, utilizzato per aggiungere più valori a un elenco:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

Utilizzando il driver Java, l'inserimento sopra può essere fatto in questo modo:

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

Quanto sopra restituisce quanto segue:

{ "_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"}]}]}

Si spera che quanto sopra migliorerà la tua comprensione del funzionamento dell'aggiornamento di un documento incorporato con Mongo utilizzando il driver Java. Noto che questa domanda è anche correlata a Spring ("mongoOperations" è una classe del pacchetto Spring), che purtroppo non conosco. Se riscontri ancora problemi con il tuo aggiornamento, forse un altro membro della community che ha più familiarità con Spring sarà in grado di aiutarti.