Eu procurei MUITO procurando respostas, mas tenho certeza de que estou perdida pelas palavras certas para descrever o que estou procurando.
Basicamente, eu tenho uma coleção mongodb chamada 'people'. O esquema para essa coleção é o seguinte:
people: {
name: String,
friends: [{firstName: String, lastName: String}]
}
Agora, eu tenho um aplicativo expresso muito básico que se conecta ao banco de dados e cria com êxito 'pessoas' com uma matriz de amigos vazia.
Em um local secundário no aplicativo, existe um formulário para adicionar amigos. O formulário recebe firstName e lastName e, em seguida, POSTs com o campo name também para referência ao objeto de pessoas apropriado.
O que estou tendo dificuldade em criar é criar um novo objeto amigo e depois "empurrá-lo" para a matriz de amigos.
Eu sei que quando faço isso pelo console mongo, uso a função update com $ push como meu segundo argumento após o critério de pesquisa, mas não consigo encontrar a maneira apropriada de obter o mangusto para fazer isso.
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
ATUALIZAÇÃO: Então, a resposta de Adrian foi muito útil. A seguir, foi o que fiz para alcançar meu objetivo.
no meu arquivo app.js, defino uma rota temporária usando
app.get('/addfriend', users.addFriend);
onde no meu arquivo users.js eu tenho
exports.addFriend = function (req, res, next)
{
var friend = {"firstName": req.body.fName, "lastName": req.body.lName};
Users.findOneAndUpdate({name: req.user.name}, {$push: {friends: friend}});
};
Respostas:
Assumindo,
var friend = { firstName: 'Harry', lastName: 'Potter' };
Existem duas opções que você tem:
Atualize o modelo na memória e salve (javascript simples array.push):
ou
Eu sempre tento escolher a primeira opção sempre que possível, porque ela respeitará mais os benefícios que o mangusto oferece a você (ganchos, validação etc.).
No entanto, se você estiver gravando muitas gravações simultâneas, encontrará condições de corrida nas quais ocorrerá erros de versão desagradáveis para impedir que você substitua o modelo inteiro a cada vez e perca o amigo anterior que você adicionou. Então, só vá para o primeiro quando for absolutamente necessário.
fonte
update
função, enquanto que NÃO É seguro para encontrar um documento, modificá-lo na memória e, em seguida, chamar o.save()
método no documento. Quando digo que uma operação é 'segura', significa que, mesmo que uma, duas ou 50 alterações estejam sendo aplicadas a um documento, todas serão aplicadas com êxito e o comportamento das atualizações será o esperado. A manipulação essencialmente na memória é insegura porque você pode estar trabalhando em um documento desatualizado, portanto, ao salvar, as alterações que ocorreram após a etapa de busca são perdidas.let done = function(err, result) { // this runs after the mongoose operation }
A resposta acima atende a todos os requisitos, mas eu consegui fazê-lo fazendo o seguinte
fonte
Use
$push
para atualizar o documento e inserir novo valor dentro de uma matriz.encontrar:
resultado para encontrar:
atualizar:
resultado para atualização:
fonte
Uma maneira fácil de fazer isso é usar o seguinte:
fonte
No meu caso, eu fiz isso
fonte
Também encontrei esse problema. Minha correção foi criar um esquema filho. Veja abaixo um exemplo para seus modelos.
---- Modelo de pessoa
*** Importante: SingleFriend.schema -> certifique-se de usar letras minúsculas para o esquema
--- Esquema filho
fonte