He buscado SO mucho buscando la respuesta, pero estoy seguro de que no tengo las palabras correctas para describir lo que busco.
Básicamente tengo una colección mongodb llamada 'people'. 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 de la aplicación, hay 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 trabajo es crear un nuevo objeto amigo y luego "empujarlo" a la matriz de amigos.
Sé que cuando hago esto a través de la consola de mongo, uso 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 forma adecuada de obtener mangosta para hacer 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 objetivo.
en mi archivo app.js, configuro 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}});
};
Respuestas:
Asumiendo,
var friend = { firstName: 'Harry', lastName: 'Potter' };
Hay dos opciones que tiene:
Actualice el modelo en memoria y guarde (javascript array.push simple):
o
Siempre trato de elegir la primera opción cuando es posible, porque respetará más de los beneficios que la mangosta le brinda (ganchos, validación, etc.).
Sin embargo, si está haciendo muchas escrituras concurrentes, llegará a condiciones de carrera donde terminará con errores de versión desagradables para evitar que reemplace el modelo completo cada vez y pierda al amigo anterior que agregó. Así que solo ve al primero cuando sea absolutamente necesario.
fuente
update
función, mientras que NO ES seguro de encontrar un documento, modificarlo en la memoria, y luego llamar al.save()
método en el documento. Cuando digo que una operación es "segura", significa que incluso si se aplican uno, dos o 50 cambios a un documento, todos se aplicarán con éxito y el comportamiento de las actualizaciones será el esperado. Esencialmente, la manipulación en la memoria no es segura porque podría estar trabajando en un documento desactualizado, por lo que cuando guarda, los cambios que ocurrieron después del paso de recuperación se pierden.let done = function(err, result) { // this runs after the mongoose operation }
La respuesta anterior cumple con todos los requisitos, pero lo hice funcionar haciendo lo siguiente
fuente
Use
$push
para actualizar el documento e insertar un nuevo valor dentro de una matriz.encontrar:
resultado para encontrar:
actualizar:
resultado para la actualización:
fuente
Una manera fácil de hacerlo es usar lo siguiente:
fuente
En mi caso, hice esto
fuente
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
*** Importante: SingleFriend.schema -> asegúrese de usar minúsculas para el esquema
--- esquema infantil
fuente