tutorial nodejs node findbyid español node.js mongodb express mongoose

node.js - nodejs - Empuje elementos en la matriz de mongo a través de mangosta



mongoose tutorial español (5)

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


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

{ $push: { <field1>: <value1>, ... } }

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

La respuesta anterior cumple con 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 infantil

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


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

Hay dos opciones que tiene:

Actualice el modelo en memoria y guarde (javascript array.push simple):

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

o

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

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 reemplazar el modelo completo cada vez y perder al amigo anterior que agregó. Así que solo ve al primero cuando sea absolutamente necesario.


Una manera fácil de hacerlo es usar lo siguiente:

var John = people.findOne({name: "John"}); John.friends.push({firstName: "Harry", lastName: "Potter"}); John.save();


Use $push para actualizar el documento e insertar un nuevo valor dentro de una matriz.

encontrar:

db.getCollection(''noti'').find({})

resultado para encontrar:

{ "_id" : ObjectId("5bc061f05a4c0511a9252e88"), "count" : 1.0, "color" : "green", "icon" : "circle", "graph" : [ { "date" : ISODate("2018-10-24T08:55:13.331Z"), "count" : 2.0 } ], "name" : "online visitor", "read" : false, "date" : ISODate("2018-10-12T08:57:20.853Z"), "__v" : 0.0 }

actualizar:

db.getCollection(''noti'').findOneAndUpdate( { _id: ObjectId("5bc061f05a4c0511a9252e88") }, { $push: { graph: { "date" : ISODate("2018-10-24T08:55:13.331Z"), "count" : 3.0 } } })

resultado de la actualización:

{ "_id" : ObjectId("5bc061f05a4c0511a9252e88"), "count" : 1.0, "color" : "green", "icon" : "circle", "graph" : [ { "date" : ISODate("2018-10-24T08:55:13.331Z"), "count" : 2.0 }, { "date" : ISODate("2018-10-24T08:55:13.331Z"), "count" : 3.0 } ], "name" : "online visitor", "read" : false, "date" : ISODate("2018-10-12T08:57:20.853Z"), "__v" : 0.0 }