Empuje elementos en la matriz mongo a través de mangosta
Básicamente tengo una colección mongodb llamada 'personas' cuyo esquema 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 "personas" con éxito con una matriz de amigos vacía.
En un lugar secundario de la aplicación, hay un formulario para agregar amigos. El formulario toma el nombre y el apellido y luego envía mensajes con el campo de nombre también como referencia al objeto de personas adecuado.
Lo que me cuesta hacer es crear un nuevo objeto amigo y luego "insertarlo" en la matriz de amigos.
Sé que cuando hago esto a través de la consola mongo uso la función de actualización como $push
segundo argumento después de los criterios de búsqueda, pero parece que no puedo encontrar la forma adecuada de hacer que mongoose haga esto.
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
Asumiendo,var friend = { firstName: 'Harry', lastName: 'Potter' };
Hay dos opciones que tienes:
Actualice el modelo en memoria y guárdelo (javascript simple array.push):
person.friends.push(friend);
person.save(done);
o
PersonModel.update(
{ _id: person._id },
{ $push: { friends: friend } },
done
);
Siempre intento optar por la primera opción cuando es posible, porque respetará más los beneficios que te brinda la mangosta (ganchos, validación, etc.).
Sin embargo, si realiza muchas escrituras simultáneas, llegará a condiciones de carrera en las que terminará con errores de versión desagradables que le impedirán reemplazar el modelo completo cada vez y perder al amigo anterior que agregó. Así que sólo recurre a este último cuando sea absolutamente necesario.
El operador $push agrega un valor específico a una matriz.
{ $push: { <field1>: <value1>, ... } }
$push agrega el campo de matriz con el valor como elemento.
La respuesta anterior cumple todos los requisitos, pero la hice funcionar haciendo lo siguiente
var objFriends = { fname:"fname",lname:"lname",surname:"surname" };
People.findOneAndUpdate(
{ _id: req.body.id },
{ $push: { friends: objFriends } },
function (error, success) {
if (error) {
console.log(error);
} else {
console.log(success);
}
});
)
Otra forma de insertar elementos en una matriz usando Mongoose es: $addToSet , si desea que solo se inserten elementos únicos en la matriz. El operador $push simplemente agrega el objeto a la matriz, ya sea que el objeto ya esté presente o no, mientras que $addToSet lo hace solo si el objeto no está presente en la matriz para no incorporar duplicaciones.
PersonModel.update(
{ _id: person._id },
{ $addToSet: { friends: friend } }
);
Esto buscará el objeto que está agregando a la matriz. Si lo encuentra, no hace nada. Si no, lo agrega a la matriz.
Referencias:
- $añadirToSet
- MongooseArray.prototipo.addToSet()