#mongodb #mongodb-query #mongodb-lookup
#mongodb #mongodb-запрос #mongodb-поиск
Вопрос:
Я вроде как новичок в базах данных без sql, поэтому у меня есть вопрос по подзапросам здесь.
Давайте представим следующую структуру:
Type (_id, offerId)
Offer (_id, typeId, productId)
Product (_id, subId)
Мне нужно найти все типы по идентификатору SubID.
Я понятия не имею, как это работает для MongoDB, в SQL я бы сделал что-то вроде:
select * from Type where offerId in
(select _id from Offer where productId in
(select _id from Product where subId = 'test'));
Для MongoDB я пытался создать какой-то запрос агрегации, но это не работает:
{
"aggregate": "Type",
"pipeline": [
{
"$lookup": {
"from": "Offer",
"localField": "_id",
"foreignField": "typeId",
"as": "subOffer"
}
},
{
"$lookup": {
"from": "Product",
"localField": "_id",
"foreignField": "subOffer.productId",
"as": "subProduct"
}
},
{
"$match": {
"subProduct.subId": "test"
}
},
{
"$unwind": "$subProduct"
},
{
"$unwind": "$subOffer"
}
]
}
Есть предложения?
Ответ №1:
Вы можете попробовать,
$lookup
оoffer
сборе с использованием конвейера$match
идентификатор типа$lookup
оproduct
сборе с использованием конвейера$match
поляsubId
иproductId
$match
продукт не[]
пуст$match
предложение не[]
пустое$project
удалить поле предложения
db.type.aggregate([
{
$lookup: {
from: "offer",
let: { tid: "$_id" },
as: "offer",
pipeline: [
{ $match: { $expr: { $eq: ["$$tid", "$typeId"] } } },
{
$lookup: {
from: "product",
as: "product",
let: { pid: "$productId" },
pipeline: [
{
$match: {
$and: [
{ subId: "test" },
{ $expr: { $eq: ["$_id", "$$pid"] } }
]
}
}
]
}
},
{ $match: { product: { $ne: [] } } }
]
}
},
{ $match: { offer: { $ne: [] } } },
{ $project: { offer: 0 } }
])