【问题标题】:MongoDB aggregation group by field colapsing several cases into the same groupMongoDB聚合按字段将多个案例合并到同一组中
【发布时间】:2019-03-23 14:31:04
【问题描述】:

我正在尝试使用 MongoDB 聚合框架解决以下情况。我的entities 集合中的文档有

  • _id.type 字段,可以是""null 或非空字符串,以及
  • attr 字段,它是一个字符串。

我想按_id.type 分组,但""null 中的元素必须属于同一个组。我正在聚合管道中的这个阶段尝试:

{
    "$group": {
        "_id": {"$cond": [{"$in": ["$_id.type", [null, ""]]}, "", "$_id.type"]},
        "attrNames": {
            "$addToSet": "$attrName"
        }
    }
},

我的理解是_id 定义了组的键,所以我想要实现的是

  • 如果_id.typenull"",则使用$cond 数组中的第二个元素,因此键为""(因此将这两个特殊情况放在同一组中)
  • 在任何其他情况下,它们使用$cond 数组中的第三个元素,因此键是_id.type

但是我收到以下错误消息:

一个流水线阶段规范对象必须只包含一个字段。

所以我想我在做坏事。

请问我应该如何修改我的聚合语句(或使用新的)来解决这种情况?

【问题讨论】:

  • 你能展示你如何使用这个$group吗?似乎您只需要将一系列阶段传递给aggregate,并且您将管道阶段作为单独的参数传递
  • 确保每个管道阶段都是数组中的一个元素,如db.yourCollection.aggregate([{$group: {...}}]),并且每个管道阶段对象的格式正确,以便阶段运算符(例如$group)是唯一的顶级字段.例如,如果您有{$group: {...}, someOtherField: 'some value'},那么您将遇到错误。如果您继续遇到问题,请向我们展示整个聚合调用,因为我们只能推测问题可能是什么而没有看到它。

标签: mongodb aggregation-framework


【解决方案1】:

正如 cmets 中所建议的(谢谢!),我碰巧使用了不正确的聚合语法。使用以下语句有效:

> db.entities.aggregate({
    "$group": {
        "_id": {"$cond": [{"$in": ["$_id.type", [null, ""]]}, "", "$_id.type"]},
        "attrNames": {
            "$addToSet": "$attrName"
        }
    }
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多