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 detener que la segunda $lookup se ejecute con la salida del primero?

Así que estoy trabajando en este proyecto donde tengo una colección de publicaciones que tienen campos como categorías y autores. Necesito recuperar datos basados en ciertas categorías y autores con la ayuda de la agregación de MongoDB.

Ahora mismo, en mi objeto de agregación tengo dos $lookups uno después del otro, y el segundo $lookup está filtrando datos de la salida del primero. Por lo tanto, no estoy obteniendo todos los datos de la colección que coinciden con los criterios del segundo $lookup.

Supongamos que en mi colección hay 10 categorías y 10 autores. Primero necesito recuperar todas las publicaciones con el nombre de categoría ‘X’ (la colección tiene 5 X). Por lo tanto, en el primer $lookup debería devolver 5 publicaciones con X.

De la misma manera, también necesito recuperar las publicaciones con el autor ‘Y’ (la colección tiene 8 Y). Pero en este momento está devolviendo todos los Ys de solo los 5 Xs. Pero necesito devolver todas las publicaciones de la colección que coinciden con Y, es decir, 8 de ellas.

Aquí está el objeto de agregación:

const aggregateObj = [ 
    {
        '$lookup': {
            'from': 'categories', 
            'localField': 'categories.category', 
            'foreignField': 'id', 
            'as': 'categories'
        }
    }, 
    {
        '$match': {
            "categories.category": {
                $in: [ 'X' ]
            }
        }
    },
    {
        '$lookup': {
            'from': 'authors', 
            'localField': 'author', 
            'foreignField': 'id', 
            'as': 'author'
        }
    }, 
    {
        '$match': {
            "author.author": {
                $in: [ 'Y' ]
            }
        }
    }
];
const result = await Post
    .aggregate( aggregateObj )
    .exec();    
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener datos basados en categorías y autores específicos con la ayuda de la función agregate de MongoDB, puedes modificar el objeto agregate de la siguiente manera:

    const aggregateObj = [
      {
        '$lookup': {
          'from': 'categories',
          'localField': 'categories.category',
          'foreignField': '_id',
          'as': 'categories'
        }
      },
      {
        '$match': {
          'categories.category': {
            $in: ['X']
          }
        }
      },
      {
        '$lookup': {
          'from': 'authors',
          'localField': 'author',
          'foreignField': '_id',
          'as': 'author'
        }
      },
      {
        '$unwind': '$author'
      },
      {
        '$lookup': {
          'from': 'categories',
          'localField': 'categories.category',
          'foreignField': '_id',
          'as': 'categories'
        }
      },
      {
        '$unwind': '$categories'
      },
      {
        '$match': {
          'author.author': {
            $in: ['Y']
          },
          'categories.category': {
            $in: ['X']
          }
        }
      }
    ];
    
    const result = await Post
      .aggregate(aggregateObj)
      .exec();
    

    En el objeto agregate modificado, realizamos una operación adicional de $lookup y un $unwind extra. Al desenrollar los arrays author y categories, podemos filtrar los datos correctamente según los criterios especificados en el operador $match. Este objeto agregate modificado debe devolver todas las publicaciones de la colección que coincidan con las categorías X y los autores Y respectivamente.

Comments are closed.