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.

Consulta de agregado de MongoDB en un array de objetos que contiene el id de múltiples colecciones.

Hola, soy nuevo en mongo y a continuación se muestra cómo se ve mi colección llamada termSet ahora. Tengo 2 colecciones separadas llamadas termsGroup y terms, a las cuales se hace referencia mediante los siguientes identificadores. Quiero ejecutar una búsqueda y mantener la estructura de la matriz tal como está. Intenté una búsqueda general con unwind, puedo obtener los detalles por separado para termGroup y terms, pero luego pierdo la estructura de matriz y no encuentro la forma de devolver la colección a su forma original.

Mi tubería actual, la colección está demasiado anidada:

{ $unwind: ‘$location.versions.types.termSet’ },
{
$lookup: {
from: TermGroup.collection.name,
localField: ‘location.versions.types.termSet.termGroup’,
foreignField: ‘_id’,
as: ‘termGroupData’,
},
},
{
$lookup: {
from: Term.collection.name,
localField: ‘location.versions.types.termSet.terms’,
foreignField: ‘_id’,
as: ‘termsData’,
},
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para mantener la estructura de matriz de la colección “termSet” al utilizar la búsqueda, puedes probar la siguiente secuencia de comandos:

    {
      $lookup: {
        from: "termsGroup",
        localField: "termSet.termGroup",
        foreignField: "_id",
        as: "termGroups"
      }
    },
    {
      $lookup: {
        from: "terms",
        localField: "termSet.terms",
        foreignField: "_id",
        as: "terms"
      }
    },
    {
      $addFields: {
        "termSet": {
          $map: {
            input: "$termSet",
            as: "ts",
            in: {
              $mergeObjects: [
                "$$ts",
                {
                  "termGroupData": {
                    $arrayElemAt: [
                      "$termGroups",
                      {
                        $indexOfArray: [
                          "$termGroups._id",
                          "$$ts.termGroup"
                        ]
                      }
                    ]
                  },
                  "termsData": {
                    $filter: {
                      input: "$terms",
                      cond: {
                        $in: [
                          "$$this._id",
                          "$$ts.terms"
                        ]
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    Esta secuencia de comandos primero realiza una búsqueda en la colección “termsGroup” para obtener los detalles del grupo de términos, y luego otra búsqueda en la colección “terms” para obtener los detalles del término. Luego fusiona los datos recuperados con los documentos originales en “termSet” utilizando el operador $map y el operador $mergeObjects. Finalmente, utiliza el operador $addFields para actualizar el campo “termSet” con los nuevos datos.

    ¡Espero que esto sea de ayuda!

Comments are closed.