добавьте $ cond в конвейер поиска $ expr
db.getCollection('authors').aggregate([
{ $match: {} },
{ $sort: { name: -1 } },
{ $addFields: { x_id___as___string: { $toString: "$_id" } } },
{ $lookup: {
from: "books",
let: { fkField:"$x_id___as___string" },
pipeline: [{ $match: { $expr: { $in: ["$$fkField", {$cond: {if: {$gt: ["$authorIds", null]}, then: "$authorIds", else: []}}] } } }],
as: "books"
}
}
])
, который проверит, существует ли authorIds
. Чтобы убедиться, что это фактический массив, вы можете использовать $isArray
db.getCollection('authors').aggregate([
{ $match: {} },
{ $sort: { name: -1 } },
{ $addFields: { x_id___as___string: { $toString: "$_id" } } },
{ $lookup: {
from: "books",
let: { fkField:"$x_id___as___string" },
pipeline: [{
$match: {
$expr: {
$in: [
"$$fkField",
{ $cond: { if: { $isArray: "$authorIds" }, then: "$authorIds", else: [] } }
]
}
}
}],
as: "books"
}
}
])