sql >> Databasteknik >  >> NoSQL >> MongoDB

Uppdatera en array med MongoDB

Save()-metoden misslyckas eftersom den försöker infoga följande dokument i samlingen:{"$push":{"resources":[en lista med resurser]}}, och "$push" är inte en giltig nyckel namn.

Från din fråga verkar det som om du försöker lägga till ytterligare ett resursdokument till listan över inbäddade dokument, "resurser", inuti det inbäddade dokumentet som matchar {"itemID" :"1"}, inuti "itemList". Stämmer detta?

Det är svårt att hantera lager av inbäddade dokument, men det kan göras:
Så här kan följande dokument infogas i "resurslistan" med JS-skalet:

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

Dokumentationen om att använda positionsoperatorn "$" för att uppdatera inbäddade dokument finns i dokumentationen "Uppdaterar":http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

Dokumentationen om "$push"-modifieraren finns också på sidan "Uppdaterar":http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

Från den postade koden verkar det som om "resurser" är en lista. Det är möjligt att metoden du behöver använda är $pushAll, som används för att lägga till flera värden till en lista:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

Med hjälp av Java-drivrutinen kan ovanstående infogning göras så här:

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

Ovanstående utmatar följande:

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

Förhoppningsvis kommer ovanstående att förbättra din förståelse för hur uppdatering av ett inbäddat dokument fungerar med Mongo med Java-drivrutinen. Jag märker att denna fråga också är relaterad till Spring ("mongoOperations" är en klass från Spring-paketet), som jag tyvärr inte är bekant med. Om du fortfarande har problem med din uppdatering kanske en annan medlem i gemenskapen som är mer bekant med Spring kan hjälpa till.




  1. Vilken NoSQL-databas ska jag använda för loggning?

  2. Mongoose query kapslade dokument större eller mindre ett visst datum

  3. Anslutning till icke existerande mongodb-server ger inget undantag

  4. Matchvillkor och senaste datum från array