Envie itens para o array mongo via mangusto

Eu vasculhei um bom pedaço procurando a resposta, 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 database e cria com sucesso ‘pessoas’ com uma matriz vazia de amigos.

Em um local secundário no aplicativo, há um formulário para adicionar amigos. O formulário aceita firstName e lastName e, em seguida, POSTs com o campo name também para referência ao object people adequado.

O que estou tendo dificuldade em criar um novo object de amigo e depois “empurrá-lo” para o array de amigos.

Eu sei que quando eu faço isso através do console mongo eu uso a function update com $ push como meu segundo argumento depois dos critérios de pesquisa, mas não consigo encontrar a maneira apropriada de fazer o mangusto fazer isso.

 db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}}); 

ATUALIZAÇÃO: Então, a resposta de Adrian foi muito útil. O seguinte é o que eu fiz para alcançar meu objective.

no meu arquivo app.js, eu defini 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}}); }; 

Assumindo, var friend = { firstName: 'Harry', lastName: 'Potter' };

Existem duas opções que você tem:

Atualize o modelo na memory e salve (plain javascript array.push):

 person.friends.push(friend); person.save(done); 

ou

 PersonModel.update( { _id: person._id }, { $push: { friends: friend } }, done ); 

Eu sempre tento e vou para a primeira opção quando possível, porque respeitará mais os benefícios que o mangusto lhe dá (anzóis, validação, etc.).

No entanto, se você estiver fazendo muitas gravações simultâneas, você atingirá as condições de corrida, onde acabará com erros desagradáveis ​​de versão 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 último quando é absolutamente necessário.

O operador $ push acrescenta um valor especificado a uma matriz.

 { $push: { : , ... } } 

$ push adiciona o campo da matriz com o valor como seu elemento.

Acima resposta atende a todos os requisitos, mas eu consegui trabalhar, fazendo o seguinte

 var objFriends = { fname:"fname",lname:"lname",surname:"surname" }; Friend.findOneAndUpdate( { _id: req.body.id }, { $push: { friends: objFriends } }, function (error, success) { if (error) { console.log(error); } else { console.log(success); } }); ) 

Eu me deparei com esse problema também. Minha correção foi criar um esquema filho. Veja abaixo um exemplo para seus modelos.

—- modelo de pessoa

 const mongoose = require('mongoose'); const SingleFriend = require('./SingleFriend'); const Schema = mongoose.Schema; const productSchema = new Schema({ friends : [SingleFriend.schema] }); module.exports = mongoose.model('Person', personSchema); 

*** Importante: SingleFriend.schema -> certifique-se de usar minúsculas para o esquema

— esquema filho

 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const SingleFriendSchema = new Schema({ Name: String }); module.exports = mongoose.model('SingleFriend', SingleFriendSchema);