将回调函数传递给mongoose聚合函数

10

我正在构建要在aggregate()中执行的查询,如下所示:

query.$project = {};
query.$project.created_at = '$created_at';
query.$project.month = {};
query.$project.month.$month = currentMonth;
query.$match = {};
query.$match.month = currentMonth.getMonth() + 1;
query.$limit = 5;
query.$sort = {};
query.$sort.created_at = -1;
query.callback = function(err, result){
    // do something
};
console.dir(query);

但是当我执行以下命令时:
DataTable.aggregate(query);

I get this:

Error: Arguments must be aggregate pipeline operators
    at Aggregate.append (C:\myproject\node_modules\mongoose\lib\aggregate.js:87:11)
    at new Aggregate (C:\myproject\node_modules\mongoose\lib\aggregate.js:47:17)
    at Function.aggregate (C:\myproject\node_modules\mongoose\lib\model.js:1889:17)
    at C:\myproject\app\routes.js:179:23
    at C:\myproject\node_modules\async\lib\async.js:570:21
    at C:\myproject\node_modules\async\lib\async.js:249:17
    at C:\myproject\node_modules\async\lib\async.js:125:13

我现在有两个问题:

  • 有没有更好的方法来构建此查询。
  • 在这里如何指定回调函数。

编辑

我将上述代码修改如下:

query.$project = {};
query.$project.created_at = '$created_at';
query.$project.month = {};
query.$project.month.$month = currentMonth;
query.$match = {};
query.$match.month = currentMonth.getMonth() + 1;
query.$limit = 5;
query.$sort = {};
query.$sort.created_at = -1;

但是当我执行以下命令时:
DataTable.aggregate(query, function(err, result){
    // do something
});

2
你构建的查询对象应该是这样的:{$project:{},$match:{},$sort:{}},但这是不正确的。正确构建的查询对象应该是这样的:[{$project:{}},{$match:{}}],就像 @thefourtheye 的回答所提到的那样。 - BatScream
1个回答

13

引用Mongoose的文档中有关aggregate的内容:

参数:

  1. [...] <Object, Array> 聚合管道操作符或操作符数组

  2. [callback] <Function>

它希望你传递:

  1. 一个聚合管道操作符数组

  2. DataTable.aggregate([{
        $project: {
            created_at: '$created_at',
            month: {
                $month: currentMonth
            }
        }
    }, {
        $match: {
            month: currentMonth.getMonth() + 1
        }
    }, {
        $limit: 5
    }, {
        $sort: {
            created_at: -1
        }
    }], function(err, result) {
    
    });
    
  3. 或多个聚合管道运算符作为单独的参数传递

    DataTable.aggregate({
        $project: {
            created_at: '$created_at',
            month: {
                $month: currentMonth
            }
        }
    }, {
        $match: {
            month: currentMonth.getMonth() + 1
        }
    }, {
        $limit: 5
    }, {
        $sort: {
            created_at: -1
        }
    }, function(err, result) {
    
    });
    
    我更喜欢使用管道建造者的方式,
    DataTable.aggregate().project({
        created_at: '$created_at',
        month: {
            $month: currentMonth
        }
    }).match({
        month: currentMonth.getMonth() + 1
    }).limit(5).sort({
        created_at: -1
    }).exec(function(err, result) {
    
    });
    

    编辑: 如果您更喜欢单独准备每个项目,则可以使用数组对象,如下所示

    var query = [];
    
    query.push({
        $project: {
            created_at: '$created_at',
            month: {
                $month: currentMonth
            }
        }
    });
    
    query.push({
        $match: {
            month: currentMonth.getMonth() + 1
        }
    });
    
    query.push({
        $limit: 5
    });
    
    query.push({
        $sort: {
            created_at: -1
        }
    });
    
    DataTable.aggregate(query, function(err, result) {
    
    });
    

    或者使用管道构建器,

    var aggregator = DataTable.aggregate();
    ...
    aggregator = aggregator.project({...});
    ...
    aggregator = aggregator.match({...});
    ...
    aggregator = aggregator.limit(...);
    ...
    aggregator = aggregator.sort(...);
    ...
    aggregator.exec(function(err, result) {
    
    });
    

可以按照我构建的查询方式完成吗?我在语法方面遇到了问题。 - jsbisht
我尝试了一下,但仍然是同样的结果。 - jsbisht
@jsbisht,您能否展示一下您具体尝试了什么? - thefourtheye
让我们在聊天中继续这个讨论 - thefourtheye
如何在上面的示例中使用聚合“选项”? - vineet
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接