MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisieren Sie ein Array mit MongoDB

Die Methode save() schlägt fehl, weil sie versucht, das folgende Dokument in die Sammlung einzufügen:{"$push":{"resources":[a list of resources]}}, und "$push" ist kein gültiger Schlüssel Name.

Aus Ihrer Frage geht hervor, dass Sie versuchen, der Liste der eingebetteten Dokumente "Ressourcen" innerhalb des eingebetteten Dokuments, das {"itemID" :"1"} entspricht, innerhalb von "itemList" ein weiteres Ressourcendokument hinzuzufügen. Ist das richtig?

Der Umgang mit Ebenen eingebetteter Dokumente ist schwierig, aber machbar:
So kann das folgende Dokument mit der JS-Shell in die "Ressourcen"-Liste eingefügt werden:

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

Die Dokumentation zur Verwendung des Positionsoperators „$“ zum Aktualisieren eingebetteter Dokumente finden Sie in der „Aktualisieren“-Dokumentation:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

Die Dokumentation zum Modifikator „$push“ befindet sich auch auf der Seite „Aktualisieren“:http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

Aus dem geposteten Code sieht es so aus, als ob "Ressourcen" eine Liste ist. Es ist möglich, dass die Methode, die Sie verwenden müssen, $pushAll ist, die zum Hinzufügen mehrerer Werte zu einer Liste verwendet wird:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

Unter Verwendung des Java-Treibers kann die obige Einfügung folgendermaßen erfolgen:

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

Das Obige gibt Folgendes aus:

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

Hoffentlich verbessert das Obige Ihr Verständnis dafür, wie das Aktualisieren eines eingebetteten Dokuments mit Mongo unter Verwendung des Java-Treibers funktioniert. Ich stelle fest, dass diese Frage auch mit Spring zusammenhängt ("mongoOperations" ist eine Klasse aus dem Spring-Paket), das ich leider nicht kenne. Wenn Sie immer noch Probleme mit Ihrem Update haben, kann Ihnen vielleicht ein anderes Mitglied der Community helfen, das sich mit Spring besser auskennt.