Попробуйте это:
{
$project: {
messages: 1,
authors: { $concatArrays: ["$userName", "$storeName"] },
consumer: {
$arrayElemAt: [{
$filter: {
input: { $concatArrays: ["$userName", "$storeName"] },
as: "authors",
cond: { $ne: ["$$authors._id", req.user._id] }
}
}, 0]
}
}
}
Вы можете использовать $ arrayElemAt непосредственно сразу после $filter
вместо дополнительной стадии $unwind
, $filter
обычно возвращает массив совпадающие объекты или []
, если ничего не найдено, поэтому, если вы используете $unwind
, вам нужно использовать его { $unwind: { path: "$consumer", preserveNullAndEmptyArrays: true } }
, в противном случае есть вероятность потери документов (у которых consumer
как []
) в конечном ответе агрегации Пожалуйста, прочитайте больше об этом здесь: $ unwind . Поэтому я бы предпочел $arrayElemAt
над $unwind
.