sql >> Database teknologi >  >> NoSQL >> MongoDB

Opdater et array ved hjælp af MongoDB

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.




  1. Find de første 20 dokumenter fra samlingen i mongodb

  2. Meteor:Meteor.call() indefra observer, at tilbagekald ikke udføres

  3. Hvordan får man ReferenceField-data i mongoengine?

  4. Tjek status for at køre MongoDB kort reducere job