sql >> Databáze >  >> NoSQL >> MongoDB

Aktualizujte pole pomocí MongoDB

Metoda save() selhává, protože se pokouší vložit do kolekce následující dokument:{"$push":{"resources":[seznam zdrojů]}} a "$push" není platný klíč název.

Z vaší otázky to vypadá, jako byste se pokoušeli přidat další zdrojový dokument do seznamu vložených dokumentů, "resources", uvnitř vloženého dokumentu, který odpovídá {"itemID" :"1"}, uvnitř "itemList". Je to správné?

Zacházení s vrstvami vložených dokumentů je složité, ale lze to provést:
Zde je návod, jak lze následující dokument vložit do seznamu „zdrojů“ pomocí shellu JS:

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

Dokumentaci k použití pozičního operátoru "$" k aktualizaci vložených dokumentů lze nalézt v dokumentaci "Aktualizace":http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

Dokumentace k modifikátoru "$push" je také na stránce "Updating":http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

Ze zaslaného kódu to vypadá, jako by „zdroje“ byl seznam. Je možné, že musíte použít metodu $pushAll, která se používá k přidání více hodnot do seznamu:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

Pomocí ovladače Java lze výše uvedené vložení provést takto:

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

Výše uvedené výstupy:

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

Doufejme, že výše uvedené zlepší vaše pochopení toho, jak aktualizace vloženého dokumentu funguje s Mongo pomocí ovladače Java. Podotýkám, že tato otázka souvisí i se Springem ("mongoOperations" je třída z balíčku Spring), které bohužel neznám. Pokud máte stále problémy s aktualizací, možná vám pomůže jiný člen komunity, který je s Springem obeznámen.




  1. ModuleNotFoundError:Žádný modul s názvem 'grp' v systému Windows

  2. Jak sdělit klientovi, kde nový master Redis používá Sentinel

  3. Mongoose, jak napsat dotaz s podmínkou if?

  4. Mongoose najít prvek v poli