Estoy creando un proyecto usando Node.js, donde tengo dos modelos: Usuario y Proyecto .
Aquí está el esquema para el modelo de proyecto:
const ProjectSchema = new mongoose.Schema({ name: { type: String, maxlength: 50, required: true, }, description: { type: String, maxlength: 800, required: true }, contributors: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }], });Ahora, para un proyecto, quiero verificar si el usuario actual ya está presente en los colaboradores del proyecto. Si el usuario no está presente, agréguelo; de lo contrario, Ignore.
¿Cómo puedo verificar eso de una manera eficiente?
mongoose le ofrece el método agregado que hace casi todo, en su caso:
const projects = ProjectModel.aggregate([ { $match: {/* query for matching a small size of projects first(you should definitely do this) */} }, { $unwind: "$contributors" }, { $project: { contributor: "$contributors" } }, // This stage is actually optional { $match: { "contributor._id": /* contributor id you want to check */ } }, { $count: "projects" } ]);Ahora puede simplemente verificar la variable y ver cuántos proyectos tienen el usuario en su matriz de contribuyentes
Probé este conjunto de datos:
[{ "_id": 1, "name": "Project1", "contributors": [{ "_id": 11, "name": "user1" }, { "_id": 22, "name": "user2" }] }, { "_id": 2, "name": "Project2", "contributors": [{ "_id": 22, "name": "user3" }, { "_id": 44, "name": "user4" }] }]Con esta consulta:
const projects = ProjectModel.aggregate([ { $match: { _id: 1 } }, { $unwind: "$contributors" }, { $project: { contributor: "$contributors" } }, { $match: { "contributor._id": 22 } }, { $count: "projects" } ]);El resultado:
[{ "projects": 1 }]Consulta
_id del usuario está en la matriz de contribuyentes2 con la id del usuario y {"_id": 2} con el documento del usuario * No hay problema de rendimiento aquí, será un máximo de 1 proyecto, supongo que con ese _id , solo haces 1 prueba para ver si ya es colaborador.
update( {"_id": {"$eq": 1}}, //find the project [{"$set": {"contributors": {"$cond": [{"$in": [2, "$contributors._id"]}, "$contributors", {"$concatArrays": ["$contributors", [{"_id": 2}]]}]}}}])necesita usar $addToSet al actualizar el documento de su proyecto.
$addToSet solo agregará un elemento a la matriz si no se agrega.
let user_id = req.body.user_id; let project_id = req.body.project_id; let data_to_update = { $addToSet:{contributors: user_id}}; Project.updateOne({ _id:project_id },data_to_update).then((updated)=>{ console.log('updated =',updated); return res.status(200).json(updated); }).catch((err)=>{ });