MongoDB聚合组通过将多个案例合并到同一组中

时间:2018-10-18 17:49:29

标签: mongodb aggregation-framework

我正在尝试使用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数组中的第3个元素,因此键为_id.type

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

  

管道阶段规范对象必须只包含一个字段。

所以我想我做得不好。

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

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的(谢谢!),发生的情况是我错误地使用了聚合语法。使用以下语句有效:

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