Mongodb 3.2(聚合):按同一属性的多个值分组

时间:2019-01-09 16:38:33

标签: mongodb aggregation-framework

我有以下计数查询:

db.collection.count({code : {$in : ['delta', 'beta']}});
db.collection.count({code : 'alpha'});
对于给定的数据集
[
    {
        "code": "detla",
        "name": "delta1"
    },
    {
        "code": "detla",
        "name": "delta2"
    },
    {
        "code": "detla",
        "name": "delta3"
    },
    {
        "code": "detla",
        "name": "delta4"
    },
    {
        "code": "beta",
        "name": "beta1"
    },
    {
        "code": "beta",
        "name": "beta2"
    },
    {
        "code": "beta",
        "name": "beta3"
    },
    {
        "code": "beta",
        "name": "beta4"
    },
    {
        "code": "beta",
        "name": "beta5"
    },
    {
        "code": "alpha",
        "name": "alpha1"
    },
    {
        "code": "alpha",
        "name": "alpha2"
    },
    {
        "code": "alpha",
        "name": "alpha3"
    }
]

是否可以使用 单聚合() 并在 mongodb@3.2 中嵌套$ group来实现此目的? 我知道这是 mapReduce()的经典用例,但是由于参数$ group by参数(上例中的code)是动态生成的属性,因此我在这里不可行,因此聚合阶段的构建也是动态的。

预期的输出与两个计数查询的结果相同。 ->第一计数查询(delta,beta组合计数)-> 9 ->第二计数查询(字母计数)-> 3

1 个答案:

答案 0 :(得分:1)

您可以在$group aggregation

下面使用
db.collection.aggregate([
  { "$group": {
    "_id": null,
    "first": {
      "$sum": {
        "$cond": [{ "$in": ["$code", ["detla", "beta"]] }, 1, 0]
      }
    },
    "second": {
      "$sum": {
        "$cond": [{ "$eq": ["alpha", "$code"] }, 1, 0]
      }
    }
  }}
])

但是我宁愿使用两个count查询来获得更好的性能

$in也发布了版本 3.4 。您可以在以前的版本中使用$setIsSubset

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "first": {
      "$sum": {
        "$cond": [{ "$setIsSubset": [["$code"], ["detla", "beta"]] }, 1, 0]
      }
    },
    "second": {
      "$sum": {
        "$cond": [{ "$eq": ["alpha", "$code"] }, 1, 0]
      }
    }
  }}
])