Я столкнулся с этой проблемой, потому что я использую keystone cms, и поэтому вынужден использовать их несколько устаревшие зависимости, которые в этом случае включают в себя более старую версию mongoose.
Мне удалось избежать этой ошибки, которую вы получаете, и получить агрегатную функциональность со следующим синтаксисом (просто замените код keystone.list на вашу модель mongoose):
keystone.list('Blurt').model.aggregate([
{
$lookup:{
from: "users",
localField: "author.id",
foreignField: "_id",
as: "userImg"
}
}
,
{
$unwind: '$userImg'
},
{
$match: { 'author.id': {$ne: req.user._id}}
},
{
$sample: {'size': 3}
},
{
$project: {
_id: '$userImg._id',
name: '$userImg.name',
smImg: '$userImg.smImg',
text: 1,
vote: 1,
blurtDate: 1,
blurtImg: 1
}
}
]).sort({ blurtDate: -1 })
.cursor().exec()
.toArray(function(err, data) {
console.log(data);
res.json(data);
});
.toArray () был необходим по какой-то причине; использование обратного вызова в методе .exec () возвращает пустой массив независимо от того, что никогда не может понять, почему. Использование mongodb 4.0.4 и mongoose 4.7.8