【问题标题】:MongoDB, Multiple count (with $exists)MongoDB,多个计数(使用 $exists)
【发布时间】:2017-06-27 12:04:56
【问题描述】:

我有这 3 个请求:

db.mycollection.count({requestA:{$exists:true}})
db.mycollection.count({requestB:{$exists:true}})
db.mycollection.count({requestC:{$exists:true}})

我只想提出一个请求... 所以我尝试了以下方法:

db.mycollection.aggregate( [
    { $group: {
        '_id' : { user_id: '$user_id'},
        requestA_count: { $sum: {
            $cond: [ {requestA:{'$exists':true}}, 1, 0 ]
        } },
        requestB_count: { $sum: {
            $cond: [ {requestB:{'$exists':true}}, 1, 0 ]
        } },
        requestC_count: { $sum: {
            $cond: [ {requestC:{'$exists':true}}, 1, 0 ]
        } },
    } },
    { $project: {
        _id: 0,
        user_id: '$_id.user_id',
        requestA_count: 1,
        requestB_count: 1,
        requestC_count: 1
    } }
] );

但我得到了错误:

"errmsg" : "exception: invalid operator '$exists'",

我猜我们不能将 $exists 与 $project 一起使用。

关于好方法的任何提示?谢谢

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您的基本想法是正确的,但 $exists 是一个查询条件,因此仅在 $match 内有效。你想要的是 $ifNull 操作符基本上做同样的事情:

    db.mycollection.aggregate( [
        { "$group": {
            "_id" : { "user_id": "$user_id" },
            "requestA_count": { "$sum": {
                "$cond": [ { "$ifNull": ["$requestA", false] }, 1, 0 ]
            } },
            "requestB_count": { "$sum": {
                "$cond": [ { "$ifNull": ["$requestB", false] }, 1, 0 ]
            } },
            "requestC_count": { "$sum": {
                "$cond": [ { "$ifNull": ["$requestC", false] }, 1, 0 ]
            } },
        } },
        { "$project": {
            "_id": 0,
            "user_id": "$_id.user_id",
            "requestA_count": 1,
            "requestB_count": 1,
            "requestC_count": 1
        } }
    ] );
    

    所以$ifNull 要么返回字段的当前值(如果存在),或者返回“右侧”参数(如果不存在)。 false 以外的返回值被解释为 true (当然除非该值实际上是 false )。

    本质上,这为您提供了与逻辑测试文档中是否存在属性相同的功能。

    【讨论】:

    • 谢谢尼尔的解释!
    • 其实 Neil、requestA_count、requestB_count、requestC_count 总是相同的值...:/!我的意思是,如果 requestA_count = 9 那么 requestB_count 和 requestC_count = 9
    • @JohnSmith 您可以编辑您的问题以显示一些具有不同字段的数据。对我来说这很有效。如果该字段不存在,则传递给 sum 的值为 0。
    • @JohnSmith 对不起。愚蠢的错字。正如我在编辑中所做的那样,所有字段都需要以$ 为前缀。这意味着他们按预期使用变量中的字段值。普通字符串将比较以评估false。现在应该适合你了。
    • 我的错,我给你一个错误的例子!现在工作正常!我只需要整理它! :)。非常感谢
    猜你喜欢
    • 2018-12-21
    • 2020-07-07
    • 2022-01-24
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多