Использование нескольких операций $lookup в агрегации MongoDB: подробное руководство

MongoDB – популярная база данных NoSQL, предлагающая мощные возможности агрегирования. Одной из ключевых особенностей структуры агрегации MongoDB является оператор $lookup, который позволяет выполнять соединения между коллекциями. В этой статье мы рассмотрим различные методы использования нескольких операций $lookup в агрегации MongoDB, а также приведем примеры кода.

Метод 1: объединение операций $lookup в цепочку
Самый простой способ использовать несколько операций $lookup — объединить их в цепочку. Каждый этап $lookup принимает в качестве входных данных выходные данные предыдущего этапа $lookup. Вот пример:

db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      localField: "customerId",
      foreignField: "_id",
      as: "customer"
    }
  },
  {
    $lookup: {
      from: "products",
      localField: "productId",
      foreignField: "_id",
      as: "product"
    }
  }
])

Метод 2: использование вложенных операций $lookup
Другой подход — использование вложенных операций $lookup. В этом методе вы указываете второй этап $lookup как массив внутри первого этапа $lookup. Вот пример:

db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      let: { customerId: "$customerId" },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$_id", "$$customerId"] }
          }
        },
        {
          $lookup: {
            from: "products",
            let: { productId: "$productId" },
            pipeline: [
              {
                $match: {
                  $expr: { $eq: ["$_id", "$$productId"] }
                }
              }
            ],
            as: "product"
          }
        }
      ],
      as: "customer"
    }
  }
])

Метод 3: использование $lookup с $facet
Этап $facet позволяет выполнять несколько операций $lookup параллельно. Каждая операция $lookup указывается как отдельный фасет на этапе $facet. Вот пример:

db.orders.aggregate([
  {
    $facet: {
      customers: [
        {
          $lookup: {
            from: "customers",
            localField: "customerId",
            foreignField: "_id",
            as: "customer"
          }
        }
      ],
      products: [
        {
          $lookup: {
            from: "products",
            localField: "productId",
            foreignField: "_id",
            as: "product"
          }
        }
      ]
    }
  }
])

В этой статье мы рассмотрели различные методы использования нескольких операций $lookup в агрегации MongoDB. Мы рассмотрели объединение операций $lookup в цепочку, использование вложенных операций $lookup и использование $lookup с $facet. Каждый метод имеет свои преимущества и может использоваться в зависимости от конкретных требований вашего приложения. Используя эти методы, вы можете эффективно объединять данные из нескольких коллекций и выполнять сложные агрегаты в MongoDB.