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.

Cómo obtener valores de un cursor de agregación que no es un array en Node.js MongoDB.

Tengo una agregación como esta:

this.collection.aggregate([
      {
        "$match": {
          _id: id
        }
      },
      {
        "$addFields": {
          "self": "$$ROOT"
        }
      },
      {
        "$graphLookup": {
          "from": "posts",
          "startWith": "$_id",
          "connectFromField": "_id",
          "connectToField": "postId",
          "as": "postLookup"
        }
      },
      {
        "$addFields": {
          "postLookup": {
            "$concatArrays": [
              "$postLookup",
              [
                "$self"
              ]
            ]
          }
        }
      },
      {
        "$lookup": {
          "from": "comments",
          "localField": "postLookup._id",
          "foreignField": "postId",
          "as": "commentsLookup"
        }
      },
      {
        "$project": {
          children: {
            posts: {
              "$map": {
                "input": "$postLookup",
                "as": "c",
                "in": "$$c._id"
              }
            },
            comments: {
              "$map": {
                "input": "$commentsLookup",
                "as": "t",
                "in": "$$t._id"
              }
            }
          }
        }
      }
    ]);

El resultado esperado debería ser así:

{
   children: {
        posts: {
            Array
          },
        comments: {
            Array
          }
}
}

El problema es que la función de agregación devuelve un cursor que no se puede convertir en un array porque no es una lista de documentos, es un objeto en el cual puedes encontrar dentro las matrices. No pude obtener estas dos matrices directamente del cursor.
¿Alguien puede guiarme sobre lo que estoy omitiendo aquí?
Gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La función de agregación devuelve un objeto de tipo cursor, que se puede iterar para acceder a los documentos de resultado uno por uno. Para obtener el resultado como un arreglo, puedes usar el método toArray() del objeto cursor. Aquí tienes un ejemplo:

    this.collection.aggregate([
      // etapas de agregación aquí
    ])
    .toArray((err, result) => {
      if(err) {
        console.error(err);
        // manejar el error
      }
      else {
        console.log(result[0].children.posts);
        console.log(result[0].children.comments);
        // procesar el arreglo de resultado
      }
    });
    

    En este fragmento de código, se llama al método toArray() en el objeto cursor devuelto por la función de agregación. La función de devolución de llamada pasada como argumento será llamada con el error (si hay alguno) y el arreglo de resultado. Puedes acceder a los dos arreglos que te interesan (posts y comments) utilizando la notación de punto en el primer elemento del arreglo de resultado (suponiendo que la función de agregación devuelve un documento).

    ¡Espero que eso ayude!

Comments are closed.