billing_account_ids: [id] }
billing_account {id, user_id, currency_id }
currency { id }
Я пытаюсь из user_account собрать это все в один объект. Но получилось как-то сильно громоздко. Может можно как-то проще?
db.getSiblingDB("billing").getCollection("user_account")
.aggregate([
{
$match: {
_id: ObjectId("64549f7b5c809efe8f9bdb11")
}
},
{
$lookup: {
from: "billing_account",
localField: "billing_account_ids",
foreignField: "_id",
as: "billing_accounts"
}
},
{
$unwind: {
path: "$billing_accounts",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "currency",
localField: "billing_accounts.currency_id",
foreignField: "_id",
as: "billing_accounts.currency"
}
},
{
$unwind: {
path: "$billing_accounts.currency",
preserveNullAndEmptyArrays: true
}
},
{
$group: {
_id: "$_id",
billing_accounts: {$push: "$billing_accounts"},
otherFields: {$first: "$$ROOT"}
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: ["$otherFields", {
billing_accounts: {
$cond: [
{"$eq": [{"$size": "$otherFields.billing_account_ids"}, 0]},
[],
"$billing_accounts"
]
}
}]
}
}
},
])
вполне обычный запрос, это ще не громоздко)
Проще только функции-утилиты писать, чтобы выглядело компактнее
но можно ваше условие про $size указать во втором лукапе, посмотрите на пример https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/#perform-an-uncorrelated-subquery-with--lookup
Обсуждают сегодня