sql >> Database >  >> NoSQL >> MongoDB

Een array bijwerken met MongoDB

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.




  1. Accenten opgeslagen in Redis zijn niet leesbaar

  2. MongoDB-gegevensbron toevoegen in Orbeon

  3. 'autoIndexID' is geen geldige verzameloptie - mongoDB

  4. MongoDB:aggregeer $project add-veld met statische waarde