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

275
Vistas
¿Cómo buscar una matriz de objetos y aún así conservar las propiedades del objeto?

Aquí está el código en el patio de recreo de mongodb .

Tengo una consulta que se ve a continuación:

 db.posts.aggregate({ $lookup: { from: "users", let: {comments: "$comments"}, pipeline: [ {$match: {$expr: {$in: ["$_id", "$$comments.userId"]} }}, {"$addFields":{"text": "$$comments.text"}} ], as: "comments" } })

El problema con esta consulta es que el valor de text que obtengo es una matriz que contiene los textos de todos los comments . Si trato de filtrar por userId de usuario, tengo otro problema. Si un usuario ha comentado más de una vez, el valor del text será una matriz que contiene todos sus comments .

¿Cómo puedo obtener el usuario buscado y su comentario como en un objeto?

EDITAR

Espero un resultado que se ve a continuación:

 [ { "_id": ObjectId("5a934e000102030405000000"), "id": "1", "comments": [ { "_id": "u1", "name": "James", "username": "jamo", "text": "Hi there, who are you?" }, { "_id": "u1", "name": "James", "username": "jamo", "text": "Hi! Are you still there?" } ], } ]
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

  • $unwind deconstruye la matriz de comments
  • $lookup unirse a la colección de usuarios,
  • $unwind obtener objeto de user
  • $group por _id y reconstruir comments con campos obligatorios
 db.posts.aggregate([ { $unwind: "$comments" }, { $lookup: { from: "users", localField: "comments.userId", foreignField: "_id", as: "comments.user" } }, { $unwind: "$comments.user" }, { $group: { _id: "$_id", id: { $first: "$id" }, comments: { $push: { _id: "$comments._id", text: "$comments.text", username: "$comments.user.username", name: "$comments.user.name" } } } } ])

Patio de recreo


Segunda opción, sin $unwind ,

  • $lookup con la colección de users
  • $map para iterar el bucle de la matriz de comments
  • $filter para iterar el aspecto de la matriz de users y encontrar información de usuario coincidente
  • $arrayElemAt devuelve el primer objeto del usuario filtrado de $filter
  • $mergeObjects combinará el objeto de comentario y la información del usuario
 db.posts.aggregate([ { $lookup: { from: "users", localField: "comments.userId", foreignField: "_id", as: "users" } }, { $project: { comments: { $map: { input: "$comments", as: "c", in: { $mergeObjects: [ "$$c", { $arrayElemAt: [ { $filter: { input: "$users", cond: { $eq: ["$$c.userId", "$$this._id"] } } }, 0 ] } ] } } } } } ])

Patio de recreo

No he probado el rendimiento de ambas consultas, intente y use la consulta adecuada

over 4 years ago · Santiago Trujillo 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