Как решить, опция 'курсор' требуется в MongoDB 3.6? - PullRequest
0 голосов
/ 07 мая 2018

Я внедряю одностраничное приложение и использую Angular JS, MongoDB Database. Поэтому я называю агрегацию двумя способами:

  1. с аргументами.
  2. Без аргументов.

Когда я использовал версию 3.4 mongoDb. Тогда оба пути работали. Но я обновил версию mongoDb с 3.4 до 3.6, тогда без аргументов она не работает. Только с агрегацией аргументов вызывает.

когда я реализовал агрегацию без аргументов .
Тогда это дает мне сообщение об ошибке ниже.

Полный ответ: {'ok': 0.0, 'errmsg': 'Опция' cursor '- требуется, за исключением агрегирования с аргументом объяснения ',' code ': 9, 'codeName': 'FailedToParse'

Я проверил некоторую ссылку в stackoverflow ;
Spring data mongodb - требуется опция «курсор»
Требуется опция «курсор», ошибка поступает из каждого агрегата

GIT URL
https://github.com/metabase/metabase/issues/6599
https://github.com/Automattic/mongoose/issues/4101

Но я не получаю решения. Это дефект с обновленной версией? Или мы должны изменить какой-то код? Заранее спасибо

1 Ответ

0 голосов
/ 20 июня 2019

Я столкнулся с этой проблемой, потому что я использую 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

...