Empuje los artículos en la matriz de mongo a través de la mongoose

He buscado mucho para encontrar la respuesta, pero estoy seguro de que estoy perdido por las palabras correctas para describir lo que busco.

Básicamente tengo una colección de mongodb llamada ‘personas’. El esquema para esa colección es el siguiente:

people: { name: String, friends: [{firstName: String, lastName: String}] } 

Ahora, tengo una aplicación express muy básica que se conecta a la base de datos y crea con éxito ‘personas’ con una matriz de amigos vacía.

En un lugar secundario en la aplicación, se encuentra un formulario para agregar amigos. El formulario toma firstName y lastName y luego POSTs con el campo de nombre también para referencia al objeto de personas adecuado.

Lo que me cuesta mucho es crear un nuevo objeto amigo y luego “empujarlo” al conjunto de amigos.

Sé que cuando hago esto a través de la consola mongo utilizo la función de actualización con $ push como mi segundo argumento después de los criterios de búsqueda, pero parece que no puedo encontrar la manera adecuada de hacer que la mongoose haga esto.

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

ACTUALIZACIÓN: Entonces, la respuesta de Adrian fue muy útil. Lo siguiente es lo que hice para lograr mi objective.

en mi archivo app.js, configuré una ruta temporal usando

 app.get('/addfriend', users.addFriend); 

donde en mi archivo users.js tengo

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

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

Hay dos opciones que tienes:

Actualice el modelo en la memoria y guárdelo (plain javascript array.push):

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

o

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

Siempre trato de buscar la primera opción cuando sea posible, porque respetará más de los beneficios que te ofrece la mongoose (ganchos, validación, etc.).

Sin embargo, si realiza muchas escrituras simultáneas, llegará a condiciones de carrera en las que terminará con errores de versiones desagradables para evitar que reemplace el modelo completo cada vez y pierda al amigo anterior que agregó. Así que solo ve a este último cuando sea absolutamente necesario.

El operador $ push agrega un valor especificado a una matriz.

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

$ push agrega el campo de matriz con el valor como su elemento.

La respuesta anterior cumple todos los requisitos, pero lo hice funcionar haciendo lo siguiente

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

Me encontré con este problema también. Mi solución fue crear un esquema hijo. Vea a continuación un ejemplo para sus modelos.

—- modelo de persona

 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 -> asegúrese de usar minúsculas para el esquema

— esquema de niño

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