De methode save() mislukt omdat wordt geprobeerd het volgende document in de verzameling in te voegen:{"$push":{"resources":[a list of resources]}}, en "$push" is geen geldige sleutel naam.
Uit uw vraag blijkt dat u probeert een ander brondocument toe te voegen aan de lijst met ingesloten documenten, "resources", in het ingesloten document dat overeenkomt met {"itemID" :"1"}, in "itemList". Klopt dit?
Omgaan met lagen van ingesloten documenten is lastig, maar het kan worden gedaan:
Hier is hoe het volgende document in de "resources"-lijst kan worden ingevoegd met behulp van de JS-shell:
> 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"
}
]
}
]
}
>
De documentatie over het gebruik van de positionele operator "$" om ingesloten documenten bij te werken, is te vinden in de documentatie "Updating":http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator
De documentatie over de "$push"-modifier staat ook op de "Updating"-pagina:http://www.mongodb.org/display/DOCS/Updating#Updating-%24push
Uit de geposte code lijkt het alsof "resources" een lijst is. Het is mogelijk dat de methode die u moet gebruiken $pushAll is, gebruikt voor het toevoegen van meerdere waarden aan een lijst:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll
Met behulp van het Java-stuurprogramma kan het bovenstaande invoegen als volgt worden gedaan:
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());
Het bovenstaande geeft het volgende weer:
{ "_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"}]}]}
Hopelijk verbetert het bovenstaande uw begrip van hoe het bijwerken van een ingesloten document werkt met Mongo met behulp van het Java-stuurprogramma. Ik merk dat deze vraag ook gerelateerd is aan Spring ("mongoOperations" is een klasse uit het Spring-pakket), die ik helaas niet ken. Als je nog steeds problemen hebt met je update, kan een ander lid van de community die beter bekend is met Spring je misschien helpen.