MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zaktualizuj tablicę za pomocą MongoDB

Metoda save() kończy się niepowodzeniem, ponieważ próbuje wstawić następujący dokument do kolekcji:{"$push":{"resources":[lista zasobów]}}, a "$push" nie jest prawidłowym kluczem Nazwa.

Z Twojego pytania wynika, że ​​próbujesz dodać kolejny dokument zasobów do listy osadzonych dokumentów, „resources”, wewnątrz osadzonego dokumentu pasującego {"itemID" :"1"}, wewnątrz "itemList". Czy to prawda?

Radzenie sobie z warstwami osadzonych dokumentów jest trudne, ale można to zrobić:
Oto jak następujący dokument można wstawić do listy „zasobów” za pomocą powłoki 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"
                }
            ]
        }
    ]
}
> 

Dokumentację dotyczącą używania operatora pozycyjnego „$” do aktualizacji osadzonych dokumentów można znaleźć w dokumentacji „Aktualizacja”:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

Dokumentacja modyfikatora „$push” znajduje się również na stronie „Aktualizacja”:http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

Z opublikowanego kodu wynika, że ​​„zasoby” to lista. Możliwe, że metodą, której musisz użyć, jest $pushAll, używana do dodawania wielu wartości do listy:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

Korzystając ze sterownika Java, powyższe wstawienie można wykonać w następujący sposób:

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

Powyższe daje następujące wyniki:

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

Mamy nadzieję, że powyższe informacje pozwolą Ci lepiej zrozumieć, jak aktualizowanie osadzonego dokumentu działa w Mongo za pomocą sterownika Java. Zauważyłem, że to pytanie dotyczy również Springa („mongoOperations” to klasa z pakietu Spring), z którym niestety nie jestem zaznajomiony. Jeśli nadal masz problemy z aktualizacją, być może inny członek Społeczności, który jest bardziej zaznajomiony ze Springiem, będzie mógł pomóc.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Jak załadować kolekcję z zagnieżdżoną tablicą w C#?

  2. Utwórz agregację filtrów na wiosnę

  3. Jak serializować pola chrono::DateTime jako ISODate podczas używania prototypu sterownika Rust Mongo?

  4. Sprawdzanie połączenia z MongoDB

  5. Węzeł nie łączy się z Mongo więcej niż raz