Empuje elementos en la matriz mongo a través de mangosta

Resuelto Neurax asked hace 8 años • 12 respuestas

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 $pushsegundo 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"}}});
Neurax avatar Oct 10 '15 09:10 Neurax
Aceptado

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.

Adrian Schneider avatar Oct 10 '2015 03:10 Adrian Schneider

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);
        }
    });
)
Parth Raval avatar Apr 19 '2018 05:04 Parth Raval

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()
Avani Khabiya avatar Sep 23 '2020 11:09 Avani Khabiya