MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mettre à jour un tableau à l'aide de MongoDB

La méthode save() échoue car elle tente d'insérer le document suivant dans la collection :{"$push":{"resources":[une liste de ressources]}}, et "$push" n'est pas une clé valide Nom.

D'après votre question, il semble que vous tentiez d'ajouter un autre document ressource à la liste des documents intégrés, "ressources", à l'intérieur du document intégré correspondant à {"itemID":"1"}, à l'intérieur de "itemList". Est-ce correct ?

La gestion des couches de documents intégrés est délicate, mais c'est faisable :
Voici comment le document suivant peut être inséré dans la liste des "ressources" à l'aide du 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 documentation sur l'utilisation de l'opérateur positionnel « $ » pour mettre à jour les documents intégrés peut être trouvée dans la documentation « Mise à jour » :http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

La documentation sur le modificateur "$push" se trouve également sur la page "Mise à jour" :http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

D'après le code publié, il semble que "ressources" soit une liste. Il est possible que la méthode que vous devez utiliser soit $pushAll, utilisée pour ajouter plusieurs valeurs à une liste :http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

À l'aide du pilote Java, l'insertion ci-dessus peut être effectuée comme suit :

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

Ce qui précède génère ce qui suit :

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

Espérons que ce qui précède améliorera votre compréhension du fonctionnement de la mise à jour d'un document intégré avec Mongo à l'aide du pilote Java. Je remarque que cette question est également liée à Spring ("mongoOperations" est une classe du package Spring), que je ne connais malheureusement pas. Si vous rencontrez toujours des problèmes avec votre mise à jour, peut-être qu'un autre membre de la communauté qui connaît mieux Spring pourra vous aider.