Использование Cursor () в агрегатах Mongo с Mongoose - PullRequest
0 голосов
/ 28 августа 2018

Я недавно обновил mongo в своей среде разработки, чтобы использовать новые функциональные возможности (Mongod 1.4 -> 4.0). Теперь все мои существующие агрегированные запросы возвращают ошибку:


{[MongoError: требуется опция 'cursor', за исключением агрегата с аргументом объяснения] name: 'MongoError', ок: 0, errmsg: Опция \ 'cursor \' обязательна, за исключением агрегирования с объяснить аргумент ', код: 9, codeName:' FailedToParse '}


Я знаю, что должен иметь возможность добавить элемент 'cursor ()' в определение конвейера (мои ожидаемые возвращаемые данные малы), но я не могу понять правильный синтаксис или найти хороший пример в Интернете, используя Синтаксис узла / мангуста. Мое лучшее предположение - добавить курсор следующим образом:

=============================================== ======

ParticipantActivityLog.aggregate([
    {   $match: {
            "$and": [
                {logDate :{$gte : new Date(postDataObj.strtDt),$lt : new Date(postDataObj.endDt)}},
                {invitationId : {$in: postDataObj.invIds}}
            ]
        }
    },
    { "$sort": {logDate: 1 }},
     { $group: {
        _id: { 
            "invitationId":'$invitationId',
            "milestoneId":'$milestoneId',
            "activityId":  '$activityId'
        },
        invitationId : { $first : '$invitationId'},
        milestoneId : { $first : '$milestoneId'},
        activityId : { $first : '$activityId'},
        activityName : { $first : '$activityName'},
        logDate: {$first:'$logDate'},
        frequency1 : {$first: '$frequency1'},
        count: { $sum: 1 }
    }}         ],

{$cursor:{}}

).exec(function(err, result){
    if(err){
        console.log(err);
        return;
    }
    return res.jsonp(result);  });

=============================================== ======

Это выдает следующую ошибку ...

Ошибка: аргументы должны быть агрегированными конвейерными операторами

... поэтому я предполагаю, что синтаксис добавленного элемента курсора как-то неверен?

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете удалить его из массива и вызвать его снаружи (прямо перед exec) Вот обновленный код:

    ParticipantActivityLog.aggregate([
        {   $match: {
                "$and": [
                    {logDate :{$gte : new Date(postDataObj.strtDt),$lt : new Date(postDataObj.endDt)}},
                    {invitationId : {$in: postDataObj.invIds}}
                ]
            }
        },
        { "$sort": {logDate: 1 }},
         { $group: {
            _id: { 
                "invitationId":'$invitationId',
                "milestoneId":'$milestoneId',
                "activityId":  '$activityId'
            },
            invitationId : { $first : '$invitationId'},
            milestoneId : { $first : '$milestoneId'},
            activityId : { $first : '$activityId'},
            activityName : { $first : '$activityName'},
            logDate: {$first:'$logDate'},
            frequency1 : {$first: '$frequency1'},
            count: { $sum: 1 }
        }}         ]

    )
.cursor({})
.exec(function(err, result){
        if(err){
            console.log(err);
            return;
        }
        return res.jsonp(result);  });

Вы указываете параметры курсора, как это (если хотите):

.cursor({ batchSize: 2500, async: true })
...