在 Mongo 聚合中使用 Cursor() 和 Mongoose

Posted

技术标签:

【中文标题】在 Mongo 聚合中使用 Cursor() 和 Mongoose【英文标题】:Using Cursor() in Mongo Aggregates with Mongoose 【发布时间】:2019-02-03 11:07:22 【问题描述】:

我最近在我的开发环境中更新了 mongo 以利用新功能(Mongod 1.4 --> 4.0)。现在我所有现有的聚合查询都返回一个错误:


[MongoError: 'cursor' 选项是必需的,聚合除外 使用解释参数] name: 'MongoError', ok: 0, errmsg: '\'cursor\' 选项是必需的,除了与 解释参数',代码:9,代码名称:'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);  );

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

这会引发以下错误...

错误:参数必须是聚合管道运算符

...所以我假设我添加的光标元素的语法以某种方式错误?

【问题讨论】:

MongoError: The 'cursor' option is required, except for aggregate with the explain argument的可能重复 更新你的猫鼬版本,如上面所说的欺骗 感谢您的回复!我之前做过'npm update mongoose',但回去又做了一次,意识到我得到的响应是:trunk\node_modules>npm update mongoose mongoose@3.8.40 mongoose └── ms@0.1.0 I根据文档应该会达到 5.x 版本,所以我会继续深入研究。 【参考方案1】:

您可以将其从数组中删除并在外部调用它(就在执行之前) 这是更新的代码:

    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 )

【讨论】:

以上是关于在 Mongo 聚合中使用 Cursor() 和 Mongoose的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoTemplate 在 spring-data-mongo Java 中进行 Mongo 聚合查询

反应式 mongo 模板:mongo 4.4.0 上的“''cursor' 选项是必需的”

在 mongo 聚合中使用当前文档键

Mongo 聚合游标和计数

尝试在springboot mongo中使用projectionoperation聚合reduce时出错

C ++写入mongo,字符串字段在聚合管道中不起作用