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.

No se puede acceder al resultado de $addFields en $lookup dentro de la función Aggregate de MongoDB.

Tengo una función de agregación en la cual hay búsquedas anidadas con una tubería.
En una de las tuberías tengo lo siguiente:

{
 "$addFields": {
  "ids": {
     "$split": ["$id", ","]
   }
  }
},
{
 "$lookup": {
   "from": 'collection2',
   "let": {"new_id": "$ids"},
    "pipeline": [
     { "$match": {
        "$expr": {
           "$in": ["$ID", "$$new_id"]
         }  
        } 
      }
     ],
    "as": 'groups'
   }
  }

En la tubería anterior, el campo “addFields” divide el valor separado por comas del campo “id” y lo agrega a una matriz llamada “ids”.

Estoy utilizando este “ids” en la búsqueda a continuación para encontrar los datos de otra colección utilizando “$in”.

Pero estoy obteniendo este error en MongoDB Compass: “$in requires an array as a second argument, found: null”.

Intenté lo mismo utilizando solo esta tubería en una tubería de agregación separada en Compass, donde obtengo los resultados correctamente, pero cuando incluyo lo mismo en mi tubería de búsqueda anidada, no funciona y da el error anterior.

¿Es debido a la anidación o alguna variable local u otro problema?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error ” $in requiere una matriz como segundo argumento, se encontró: null” ocurre porque el valor de “$ids” no es una matriz en algunos casos. Esto podría ocurrir cuando el campo “id” separado por comas está vacío o es nulo, lo que resulta en una matriz “ids” vacía o nula.

    Para evitar este error, puedes agregar una etapa de “$match” antes de la etapa “$addFields” para filtrar los documentos donde “id” está vacío o es nulo. Por ejemplo:

    {
      "$match": {
        "id": { "$exists": true, "$ne": "" }
      }
    },
    {
      "$addFields": {
        "ids": {
          "$split": ["$id", ","]
        }
      }
    },
    {
      "$lookup": {
        "from": "collection2",
        "let": { "new_id": "$ids" },
        "pipeline": [
          {
            "$match": {
              "$expr": {
                "$in": ["$ID", "$$new_id"]
              }
            }
          }
        ],
        "as": "groups"
      }
    }
    

    También puedes verificar si alguno de los documentos en “collection1” tiene valores de “id” vacíos o nulos, y actualizarlos si es necesario para evitar tales errores en el futuro.

Comments are closed.