如何在一个查询中获得多个计数?

时间:2014-07-21 21:26:21

标签: javascript node.js mongodb mongoose aggregation-framework

我有BlogPost模型,其中两个属性为draft: Booleanuser: String

使用Mongoose的mongo聚合框架,是否可以在一个查询中获得以下计数?

BlogPost.count({ user: userID }, function(err, response() {});
BlogPost.count({ user: userID, draft: true }, function(err, response() {});

2 个答案:

答案 0 :(得分:3)

$cond运算符是一个三元运算符,它将条件表达式计算为true/false,并根据评估分别返回第二个或第三个参数。在这种情况下,您的字段是布尔true/false,因此无需使用其他运算符进行测试。您可以在$sum

中实现此功能
BlogPost.aggregate(
    [
        { "$group": {
            "_id": null,
            "total_count": { "$sum": 1 },
            "draft_count": { "$sum": { "$cond": [ "$draft", 1, 0 ] } }
        }
    ],
    function(err,results) {

    }
);

null传入_id组的值意味着您不是"分组"在任何特定的文档密钥上,但是对集合中的文档所有进行分组。

答案 1 :(得分:0)

这是一个聚合查询,当我们在使用它的一个查询中必须计数十个以上的表数据时

   const res= await taskModel.aggregate([
            {
                $facet:
                {
                    "count1": [
                        {
                            $match:
                                { user_id: ObjectId(data.user_id) }
                        }, { $count: "mycount" }]
                    ,
                    "count2":
                        [{
                            $match:
                            {
                                $and:
                                    [{ user_id: ObjectId(data.user_id) }, { task_status: 2 }]
                            }
                        },
                        { $count: "mycount" }]
                }
            }])