Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

234
Views
¿Cómo verificar si un ObjectId está presente en una matriz en mongoose?

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?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

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 }]

Enlace del patio de recreo

about 4 years ago · Juan Pablo Isaza Report

0

Consulta

  • encuentra el proyecto
  • compruebe si el _id del usuario está en la matriz de contribuyentes
  • si es no hacer nada (mantener el valor anterior)
  • de lo contrario, agregue el nuevo usuario
  • reemplace 2 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.

Código de prueba aquí

 update( {"_id": {"$eq": 1}}, //find the project [{"$set": {"contributors": {"$cond": [{"$in": [2, "$contributors._id"]}, "$contributors", {"$concatArrays": ["$contributors", [{"_id": 2}]]}]}}}])
about 4 years ago · Juan Pablo Isaza Report

0

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)=>{ });
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!