为什么 mongo 不允许在另一个 $facet 中使用 $facet 阶段?

zag*_*art 9 mongodb mongodb-query aggregation-framework

$facet从 3.4 开始在 mongo 中有聚合阶段 - 这很酷。它允许在同一组输入文档的单个阶段内处理多个聚合管道。

但是它不允许在另一个中使用一个 $facet。引用:“任何其他聚合阶段也可以与 $facet 一起使用,除了:$facet、$out、$geoNear、$indexStats、$collStats”

有人明白原因吗?

我只想这样使用 $facet:

db.collection.aggregate([{
  $facet: {
    'first': [
      $facet: { // here is the sub $facet
         'subFirst1': [],
         'subFirst2': []
      }   
    ],
    'second': [
      //...
    ]
  }
}])
Run Code Online (Sandbox Code Playgroud)

这应该产生一个文档,如:

{
  first: {
    subFirst1: {...},
    subFirst2: {...}
  },
  second: {...}
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试这个它会抛出错误:

specified stage is not allowed to be used within a $facet stage: 0: { $facet: { subFirst1: [ ... ] } }"
Run Code Online (Sandbox Code Playgroud)

Gua*_*667 5

这不仅仅是关于方面。一般来说,不允许在聚合阶段创建子字段。例如,以下创建复数值的尝试失败。

$addField: {
  a.b: "foo"
}
Run Code Online (Sandbox Code Playgroud)

这是很有意义的,因为值可以是原始类型、复杂对象或数组。不知道这是否是一个令您满意的答案,也许这是一个小小的安慰,因为这不仅适用于方面,而且适用于所有一般作业。

我还想说你的意图是合理的。特别是在数据库系统中,不需要模式并且每个文档都可以与其他文档不同,因此拥有该功能会很好。如果您实际上操作数据,您可以使用set. 但根据您的中间结果,您不允许执行该操作。人们可能会认为这有点不一致。