当前位置: 首页 > 知识库问答 >
问题:

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

梁丘俊人
2023-03-14

我有以下计数查询:

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

有没有办法使用single aggregation()和嵌套的$group来实现这一点mongodb@3.2? 我知道这是mapReduce()的一个经典用例,但我在这里没有选择,因为$group by parameters(code)是一个动态生成的属性,因此聚合阶段的构建也是动态的。

预期输出与两个计数查询的结果相同。-

共有1个答案

章兴发
2023-03-14

您可以使用下面的$group聚合

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

但是为了获得更好的性能,我更愿意使用两个计数查询

$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]
      }
    }
  }}
])
 类似资料:
  • 我目前正在努力设置产品变化作为压缩产品目录的一种手段...我们目前有几千个单独的产品页面和变化,我正在寻找一种方法来压缩每个产品类型到一个单一的变化。销售的产品与车辆相关,因此适合每个车型的年份范围: WooCommerce的罐装可变产品为每种属性组合创造了新的变化。例如,“Body Style A”将创建两个相同的变体,我更希望有一个变体,在“年份”是2002年或2003年,而不是只指定一个值。

  • 这是我的代码: 我想将的值设置为,我该怎么做?我试过,

  • 我想知道流(或收集器)中是否已经实现了一个功能,它首先按属性对流进行分组,然后返回列表中按另一个属性排序的第一个元素。例如,以下代码尝试使用第一个属性对对象流进行分组,然后希望收集第二个属性值最高的对象。 现在,我想用流myClassStream实现类似的功能- 我的代码使用简单的循环是: 任何帮助将不胜感激。

  • 本文向大家介绍MongoDB聚合分组多个结果,包括了MongoDB聚合分组多个结果的使用技巧和注意事项,需要的朋友参考一下 要聚合多个结果,请在MongoDB中使用$group。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是汇总组多个结果的查询- 这将产生以下输出-

  • 很简单地说,我有 假设我每个有3000个 创建新的

  • 我有以下文件: 如何发出请求,将Sigle\U 1和Sigle\U 2连接起来,并将值reslut分组? 预期结果示例: 我试过了,但还不完全