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

142
Views
MongoDB: devuelva solo el documento de una matriz que coincida con una determinada consulta (JS)

Tengo una colección MongoDB en forma de:

 users: { { user_id: 1000, activities: [ {id: 1, activity: 'swimming'}, {id: 2, activity: 'running'}, {id: 3, activity: 'biking'},... ] },... }

y quiero obtener el documento de actividad que coincida con una identificación específica. Por ejemplo, si consulto usando {id: 1} , quiero una salida de {id: 1, activity: 'swimming'} . Actualmente, estoy tratando de usar findOne({activities: {$elemMatch: {id: 1}}}) , pero devuelve el documento de usuario completo (la identificación del usuario y todas las actividades).

El código que estoy usando es:

 id = req.body.queryID; db.collection('users').findOne({activities: {$elemMatch: {id}}}) .then((document) => { console.log(document); // more code after this });

También intenté consultar usando added aggregate() y findOne({}, {activities: {$elemMatch: {id}}}) , pero no pude resolverlo.

Estoy en MongoDB versión 4.4.8 según db.version() . ¡Cualquier ayuda es apreciada!

about 4 years ago · Santiago Gelvez
3 answers
Answer question

0

Puede usar el método aggregate con las canalizaciones de unwind , match y project

 db.users.aggregate([ {$unwind: "$activities"}, {$match: {"activities.id": id}}, {$project: {id: "$activities.id", activity: "$activities.activity", _id: 0}} ])

NOTA: Este código está escrito usando la sintaxis de mongo shell.

La consulta hace lo siguiente

  1. comienza con la canalización de unwind que primero extrae todos los elementos de la matriz de actividades.
  2. La tubería de match encuentra el elemento de matriz que tiene la identificación que estamos buscando
  3. La canalización del project devuelve el resultado deseado

Espero que esto ayude

about 4 years ago · Santiago Gelvez Report

0

Tus intentos se ven cercanos, creo que solo necesitas juntarlos. findOne toma dos argumentos opcionales, una consulta y una proyección. La consulta le dice a MongoDB qué documento buscar y devolver. El documento de proyección le dice a MongoDB qué campo(s) incluir en el documento devuelto por la consulta.

Lo que tienes aquí:

 db.collection('users').findOne({ activities: { $elemMatch: { id }}})

Pasa un argumento, la consulta. Buscará un documento donde haya un elemento en la matriz de activities con una id igual al valor de la variable id . También podría escribir esto como:

 db.collection('users').findOne({ "activities.id": id })

También le gustaría devolver solo documentos en la matriz de activities con una identificación coincidente. Aquí es cuando haría algo como su otro intento, donde $elemMatch está en el segundo argumento, la proyección:

 db.collection('users').findOne({}, {activities: {$elemMatch: {id}}})

Pero debido a que pasó una consulta vacía, MongoDB devolverá cualquier documento, no necesariamente uno que contenga una actividad con una ID coincidente.

Entonces, si pasa tanto una consulta como la proyección, creo que debería obtener lo que está buscando. Podría verse así:

 db.collection('users').findOne({ "activities.id": id }, { activities: { $elemMatch: { id }}})

Esto incluirá solo el campo _id y el documento de activities correspondiente, si existe. Si desea incluir otros campos del documento, deben incluirse explícitamente. Consulte esta documentación sobre proyección .

about 4 years ago · Santiago Gelvez Report

0

Por favor intente de la siguiente manera:

 db.users.aggregate([ { '$unwind': '$activities' }, { '$match': { 'id': id } }, { '$project': { 'activity': '$activities.activity', 'id': '$activities.id', '_id':0 } } ]);
about 4 years ago · Santiago Gelvez 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!