MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Atualizar um array usando o MongoDB


O método save() está falhando porque está tentando inserir o seguinte documento na coleção:{"$push":{"resources":[a list of resources]}} e "$push" não é uma chave válida nome.

Da sua pergunta, parece que você está tentando adicionar outro documento de recurso à lista de documentos incorporados, "resources", dentro do documento incorporado correspondente a {"itemID" :"1"}, dentro de "itemList". Isso está correto?

Lidar com camadas de documentos incorporados é complicado, mas pode ser feito:
Aqui está como o seguinte documento pode ser inserido na lista de "recursos" usando o shell 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"
                }
            ]
        }
    ]
}
> 

A documentação sobre como usar o operador posicional "$" para atualizar documentos incorporados pode ser encontrada na documentação "Atualizando":http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

A documentação sobre o modificador "$push" também está na página "Atualizando":http://www.mongodb.org/display/DOCS/Updating#Updating-%24push

A partir do código postado, parece que "recursos" é uma lista. É possível que o método que você precise usar seja $pushAll, usado para adicionar vários valores a uma lista:http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll

Usando o driver Java, a inserção acima pode ser feita assim:
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());

O acima gera o seguinte:
{ "_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"}]}]}

Felizmente, o que foi dito acima melhorará sua compreensão de como a atualização de um documento incorporado funciona com o Mongo usando o driver Java. Percebo que essa questão também está relacionada ao Spring ("mongoOperations" é uma classe do pacote Spring), com o qual infelizmente não estou familiarizado. Se você ainda estiver tendo problemas com sua atualização, talvez outro membro da comunidade que esteja mais familiarizado com o Spring possa ajudar.