从3.4开始,mongo中存在 $facet
聚合阶段-
这个很酷。它允许在同一阶段的同一组输入文档上处理多个聚合管道。
但这不允许在一个$ facet中使用另一个。引用:“除$ facet,$ out,$ geoNear,$ indexStats,$ collStats外,任何其他聚合阶段也可以与$ facet一起使用”
有人知道原因吗?
我只想以这种方式使用$ facet:
db.collection.aggregate([{
$facet: {
'first': [
$facet: { // here is the sub $facet
'subFirst1': [],
'subFirst2': []
}
],
'second': [
//...
]
}
}])
这应该产生一个像这样的文档:
{
first: {
subFirst1: {...},
subFirst2: {...}
},
second: {...}
}
如果我尝试这样做,则会引发错误:
specified stage is not allowed to be used within a $facet stage: 0: { $facet: { subFirst1: [ ... ] } }"
最佳答案
这不仅涉及方面。通常,不允许在聚合阶段创建子字段。例如,以下创建复杂值的尝试失败。
$addField: {
a.b: "foo"
}
这很有意义,因为值可以是原始类型,复杂对象或数组。不知道这是否对您来说是令人满意的答案,也许这只是一点安慰,它不仅对各个方面都很重要,而且对所有一般任务都非常重要。
我还想说你的意图是合理的。尤其是在不需要模式且每个文档都可以彼此不同的数据库系统中,拥有该功能将是很好的。如果您实际操作数据,则可以使用
set
进行操作。但是在中间结果上,不允许您执行该操作。可以认为这有点不一致。关于mongodb - 为什么mongo不允许在另一个$ facet内使用$ facet阶段?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41888671/