Save()-metoden mislykkes, fordi den forsøger at indsætte følgende dokument i samlingen:{"$push":{"resources":[en liste over ressourcer]}}, og "$push" er ikke en gyldig nøgle navn.
Fra dit spørgsmål ser det ud til, at du forsøger at tilføje et andet ressourcedokument til listen over indlejrede dokumenter, "ressourcer", inde i det indlejrede dokument, der matcher {"itemID" :"1"}, inde i "itemList". Er dette korrekt?
Det er vanskeligt at håndtere lag af indlejrede dokumenter, men det kan gøres:
Sådan kan følgende dokument indsættes i "ressourcer"-listen ved hjælp af JS-skallen:
> 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 brug af positionsoperatoren "$" til at opdatere indlejrede dokumenter kan findes i dokumentationen "Opdaterer":http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator
Dokumentationen om "$push"-modifikatoren er også på siden "Opdaterer":http://www.mongodb.org/display/DOCS/Updating#Updating-%24push
Fra den postede kode ser det ud som om "ressourcer" er en liste. Det er muligt, at den metode, du skal bruge, er $pushAll, der bruges til at tilføje flere værdier til en liste:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll
Ved at bruge Java-driveren kan ovenstående indsættelse gøres sådan:
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());
Ovenstående udsender følgende:
{ "_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"}]}]}
Forhåbentlig vil ovenstående forbedre din forståelse af, hvordan opdatering af et indlejret dokument fungerer med Mongo ved hjælp af Java-driveren. Jeg bemærker, at dette spørgsmål også er relateret til Spring ("mongoOperations" er en klasse fra Spring-pakken), som jeg desværre ikke er bekendt med. Hvis du stadig har problemer med din opdatering, kan et andet medlem af fællesskabet, der er mere fortrolig med Spring, måske hjælpe.