如何在Aggregate MongoDB中设置'cursor'选项

时间:2018-03-08 12:21:07

标签: angularjs node.js mongodb mongoose aggregate

我的API服务器上有一个Aggregate命令。它运行良好,直到我将MongoDB更新到3.6.3。现在我得到了这样的错误:“'cursor'选项是必需的,除了带有explain参数的聚合”。 这是我的例子:

ArchiveReq.aggregate({
                $project: {
                    projectId: 1,                       
                    projectName: 1,
                    shortDescription: 1,
                    numOfStudents: 1,
                    creationDate: 1,
                    matches: {$ne: ['$creationDate', '$updateDate']}
                }
            },
            function (err, Requests) {              
                if (err)
                    return res.send(err)

                res.json(Requests);
            }
        ); 

2 个答案:

答案 0 :(得分:2)

ArchiveReq.aggregate([
                    $project: {
                    projectId: 1,                       
                    projectName: 1,
                    shortDescription: 1,
                    numOfStudents: 1,
                    creationDate: 1,
                    matches: {$ne: ['$creationDate', '$updateDate']}
                    }
                     ],
                     {
                       cursor: { batchSize: 0 }
                     }
                   ).exec(function(error, cursor) {

                   // use cursor 

                   });

版本3.4中更改:除非命令包含explain选项,否则MongoDB 3.6将删除不带游标选项的aggregate命令的使用。除非包含说明选项,否则必须指定游标选项。例如:

要指示具有默认批量大小的游标,请指定cursor:{}。

要指示具有非默认批量大小的游标,请使用cursor:{batchSize:}。

以下示例对文章集合执行聚合操作,以计算集合中显示的标记数组中每个不同元素的计数。有关详细信息,请参阅https://docs.mongodb.com/manual/reference/command/aggregate/

db.runCommand( {
   aggregate: "articles",
   pipeline: [
      { $project: { tags: 1 } },
      { $unwind: "$tags" },
      { $group: { _id: "$tags", count: { $sum : 1 } } }
   ],
   cursor: { }
} )

答案 1 :(得分:0)

如果你想在mongo 3.6中使用聚合函数

你可以试试这个

let resArchiveReq= await ArchiveReq.aggregate([
                { ... }
            ]).cursor({}).exec().toArray()

        return res.json({ result: resArchiveReq })