5
respostas

comando push descendo níveis no json

db.teste.insert({ name : "teste", produto: [] filial: [{ id: ObjectId(), menu : [], }], })

os produtos possuem um objectID, e a field menu é um vetor de objects id refernte aos produtos

logo esse update nao funciona

db.teste.update( { "filial.id" : ObjectId("5a8cd443ab270699828e5ea9") }, { $push:{ "menu": ObjectId("5a8cd51fab270699828e5eab") } },false,true)

5 respostas

Oi Guilherme, tudo bem? Não funciona por que você está tentando acessar o id direto no array de filiais. A query de seleção precisa considerar isso. Tenta o seguinte:

db.teste.update( { "filial" :  {"id" : ObjectId("5a8cd443ab270699828e5ea9")}  }, UPDATE_AQUI)

usando o $elemMatch consegui selecionar o ID, porém não consegui atualizar o campo que queria, por exemplo

db.teste.update({
    {filial:  {$elemMatch : {_id: ObjectId("5a8cd443ab270699828e5ea9")}}},
    {
        $push : {
            filial.$.menu:  "teste"
        }
    }
})

Guilherme, acho que você não precisa desse cifrão no meio do push, eu mesmo não o encontrei na documentação. filial.menu não funciona direto?

ja tentei e não funciona, ele da um erro e nem chega a fazer o push

Oi Guilherme, tudo bem? Desculpa a demora. Mas analisando aqui a documentação do Mongo, sua query faz muito sentido. Só tem um detalhe, o update sempre requer dois objetos, um com a query e outro com a operação. Você passou só um com envolve tudo, talvez por isso tenha tido erro.

Quando houver erros, lembra de postar a mensagem de erro aqui, tá bem? Ela ajuda bastante a detectar problemas.

Mas vamos lá, olha como a sua query tá escrita:

db.teste.update(
    {
        { filial: { $elemMatch : { _id: ObjectId("5a8cd443ab270699828e5ea9") } } },
        { $push : { filial.$.menu:  "teste" } }
    }
);

Quando deveria ser assim:

db.teste.update(
    { filial: { $elemMatch : { _id: ObjectId("5a8cd443ab270699828e5ea9") } } },
    { $push : { filial.$.menu:  "teste" } }
);

Testa de novo pra gente ver se agora dá certo?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software