Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

235
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda