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.