【问题标题】:How To Get Multiple Counts In One Query?如何在一个查询中获得多个计数?
【发布时间】:2014-09-12 13:08:51
【问题描述】:

我有一个BlogPost 模型,它的两个属性是draft: Booleanuser: String

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

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

【问题讨论】:

  • 是的,如果 draft 为真,您可以使用 $cond 有条件地总结其他 draft_count 字段

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


【解决方案1】:

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

   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" }]
                }
            }])

【讨论】:

    【解决方案2】:

    $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 传递给group 的_id 值意味着您不是对任何特定文档键进行“分组”,而是对集合中的所有文档进行分组。

    【讨论】:

    • 谢谢尼尔,今天晚些时候试试这个!
    • Neil,我刚刚尝试过,它适用于所有文档。但是,在最初的问题中,我问如何指定两个条件:草稿布尔值和用户:字符串。如何将用户条件与草稿条件一起放入其中以仅对特定用户的博客帖子执行此操作?
    • @ac360 在聚合管道的头部使用 $match 管道阶段。它采用与.find() 相同的所有查询选项
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多