MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Актуализирайте масив с помощта на MongoDB

Методът save() е неуспешен, защото се опитва да вмъкне следния документ в колекцията:{"$push":{"resources":[списък с ресурси]}} и "$push" не е валиден ключ име.

От въпроса ви изглежда, че се опитвате да добавите друг ресурсен документ към списъка с вградени документи, „ресурси“, вътре във вградения документ, съответстващ на {„itemID“ :„1“}, вътре в „itemList“. Това правилно ли е?

Работата със слоеве от вградени документи е трудна, но може да се направи:
Ето как следният документ може да бъде вмъкнат в списъка с „ресурси“ с помощта на 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"
                }
            ]
        }
    ]
}
> 

Документацията относно използването на позиционния оператор "$" за актуализиране на вградени документи може да бъде намерена в документацията за "Актуализиране":http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

Документацията за модификатора "$push" също е на страницата "Актуализиране":http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

От публикувания код изглежда, че „ресурси“ е списък. Възможно е методът, който трябва да използвате, да е $pushAll, използван за добавяне на множество стойности към списък:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

Използвайки Java драйвера, горното вмъкване може да се направи по следния начин:

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

Горното извежда следното:

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

Надяваме се, че горното ще подобри разбирането ви за това как работи актуализирането на вграден документ с Mongo с помощта на Java драйвера. Забелязвам, че този въпрос също е свързан с Spring ("mongoOperations" е клас от пакета Spring), с който за съжаление не съм запознат. Ако все още имате проблеми с актуализацията си, може би друг член на общността, който е по-запознат с Spring, ще може да помогне.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Актуализирайте елемент в масив, който е в масив

  2. Използване на MongoDB срещу MySQL с много JSON полета?

  3. Как да конвертирате дати в масив с $dateFromString?

  4. Създайте и намерете GeoLocation в mongoose

  5. MongoDB незадължителен уникален индекс