Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

285
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda