【发布时间】: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.type为null或"",则使用$cond数组中的第二个元素,因此键为""(因此将这两个特殊情况放在同一组中) - 在任何其他情况下,它们使用
$cond数组中的第三个元素,因此键是_id.type
但是我收到以下错误消息:
一个流水线阶段规范对象必须只包含一个字段。
所以我想我在做坏事。
请问我应该如何修改我的聚合语句(或使用新的)来解决这种情况?
【问题讨论】:
-
你能展示你如何使用这个
$group吗?似乎您只需要将一系列阶段传递给aggregate,并且您将管道阶段作为单独的参数传递 -
确保每个管道阶段都是数组中的一个元素,如
db.yourCollection.aggregate([{$group: {...}}]),并且每个管道阶段对象的格式正确,以便阶段运算符(例如$group)是唯一的顶级字段.例如,如果您有{$group: {...}, someOtherField: 'some value'},那么您将遇到错误。如果您继续遇到问题,请向我们展示整个聚合调用,因为我们只能推测问题可能是什么而没有看到它。
标签: mongodb aggregation-framework