es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Buscar en un array de objetos.

Cómo buscar un objeto por id de referencia y otras propiedades.

collectionA


{
_id: ObjectId("6013859ba0c3120034d08bfa"),
name: "A1",
refs:[
{id: ObjectId("6013859ba0c3120034d08bfb"), text: "ABC"},
{id: ObjectId("6013859ba0c3120034d08bfc"), text: "DEF"}
]
}

collectionB


{
_id: ObjectId(“6013859ba0c3120034d08bfb”),
name: “B1”
}

{
_id: ObjectId(“6013859ba0c3120034d08bfc”),
name: “B2”
}

Resultado esperado


{
_id: ObjectId("6013859ba0c3120034d08bfa"),
name: 'A1',
refs:[
{id: ObjectId("6013859ba0c3120034d08bfb"), name: "B1", text: "ABC"},
{id: ObjectId("6013859ba0c3120034d08bfc"), name: "B2", text: "DEF"}
]
}

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para buscar un objeto por su id de referencia y otras propiedades, podemos usar la etapa $lookup de agregación en la tubería de MongoDB. Aquí hay una consulta de ejemplo que logra el resultado esperado:

    db.collectionA.aggregate([
      {
        $unwind: "$refs"
      },
      {
        $lookup: {
          from: "collectionB",
          localField: "refs.id",
          foreignField: "_id",
          as: "refsObject"
        }
      },
      {
        $unwind: "$refsObject"
      },
      {
        $project: {
          _id: 1,
          name: 1,
          refs: {
            id: "$refs.id",
            name: "$refsObject.name",
            text: "$refs.text"
          }
        }
      },
      {
        $group: {
          _id: "$_id",
          name: {
            $first: "$name"
          },
          refs: {
            $push: "$refs"
          }
        }
      }
    ])
    

    Explicación:
    – Primero, usamos la etapa $unwind para separar cada elemento en el arreglo refs en su propio documento.
    – Luego, usamos la etapa $lookup para realizar una unión externa izquierda con collectionB, usando el campo refs.id en collectionA y el campo _id en collectionB para hacer coincidir los documentos.
    – Luego, usamos otra etapa $unwind para separar cada documento coincidente en collectionB en su propio documento.
    – Después de eso, usamos la etapa $project para remodelar los documentos de salida, renombrando algunos campos y eliminando campos innecesarios.
    – Finalmente, usamos la etapa $group para agrupar los documentos de salida en un solo documento basado en el campo _id original, y usamos el acumulador $push para recrear el arreglo refs con los nuevos campos.

    Los documentos resultantes tendrán la estructura deseada, con el arreglo refs que contiene objetos que tienen las propiedades id, name y text.

Comments are closed.