Вы можете использовать $ setIntersection , чтобы найти общие записи в обоих массивах, а затем фильтровать документы по $ size результата gt чем 0 (означает, что по крайней мере один элемент является общим для массивы) и, наконец, используйте $ count stage для подсчета документов, соответствующих этому условию.
- EDIT: добавьте $ addFields stage в случае отсутствия массива для приведения или директоров
В случае любого документа, который не содержит cast или массив директоров, вы получите ошибку для размера, ожидающего массив и получающего нулевое значение. Чтобы избежать этого, вам нужно добавить этап $ addField для определения пустого массива вместо нуля для приведения и директоров.
Вот запрос:
db.collection.aggregate([
{
$addFields: {
directors: {
$cond: {
if: {
$isArray: "$directors"
},
then: "$directors",
else: []
}
},
cast: {
$cond: {
if: {
$isArray: "$cast"
},
then: "$cast",
else: []
}
}
}
},
{
$match: {
$expr: {
$gt: [
{
$size: {
$setIntersection: [
"$cast",
"$directors"
]
}
},
0
]
}
}
},
{
$count: "have_common_value"
}
])
Вы можете проверить это здесь