获取在数组中返回的所有计数

时间:2014-07-26 05:09:40

标签: mongodb mongodb-query aggregation-framework

我有以下疑问。

//returns total where field callback exist and not empty
db.parts.find({callback:{"$exists" : true, "$ne" : ""}}).count();

//returns total where field callback exist and empty
db.parts.find({callback:{"$exists" : true, "$in" : [""]}}).count();

//returns total where field callback doesn't exist
db.parts.find({callback:{"$exists" : false}}).count();

我想构造一个返回数组中所有三个计数的查询,如下所示。

{ "callbacks" : sum, "emptycallbacks" : sum, "missingcallbacks": sum }

感谢。

1 个答案:

答案 0 :(得分:1)

aggregation framework正是您在这里寻找的。您主要从$cond管道中的$group运算符获得结果:

db.parts.aggregate([
    { "$group": {
        "_id": null,
        "callbacks": {
            "$sum": {
                "$cond": [
                    { "$ne": [{ "$ifNull": ["$callback",""]}, "" ] },
                    1,
                    0
                ]
            }
        },
        "emptycallbacks": {
            "$sum": {
                "$cond": [
                    { "$eq": [ "$callback", "" ] },
                    1,
                    0
                ]
            }
        },
        "missingcallbacks": {
            "$sum": {
                "$cond": [
                    {"$ifNull": [ "$callback", false ] },
                    0,
                    1
                ]
            }
        }
    }}
])

每个都使用不同的comparison operators,但主要是$ifNull来测试文档中是否存在该字段。由于$cond是三元运算符,因此从条件分别为truefalse的位置评估第二个和第三个参数。

将这些值传递给$sum运算符以将其添加。 null作为分组键意味着将所有内容添加到集合中,而不对特定字段值进行“分组”。

鉴于以下文件:

{ "callback" : "a" }
{ "callback" : "" }
{ "other" : "a" }
{ "callback" : "" }
{ "something" : "a" }
{ "else": "a" }

结果是:

{ "_id" : null, "callbacks" : 1, "emptycallbacks" : 2, "missingcallbacks" : 3 }

显示所有条件都正确计数。

您可能需要为实际文档扩展该逻辑,但这是一般方向。