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

时间:2017-01-27 07:15:44

标签: mongodb mongodb-query aggregation-framework

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

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

有谁理解原因?

我只想以这种方式使用$ 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: [ ... ] } }"

1 个答案:

答案 0 :(得分:0)

不仅涉及方面。通常,不允许在聚合阶段创建子字段。例如,以下创建复杂值的尝试失败。

completionHandler(.alert)

这很有意义,因为值可以是原始类型,复杂对象或数组。不知道这是否对您来说是令人满意的答案,也许这只是一点安慰,它不仅对各个方面都很重要,而且对所有一般任务也很重要。

我也想说你的意图是合理的。尤其是在不需要模式且每个文档都可以彼此不同的数据库系统中,拥有该功能将是很好的。如果您实际操作数据,则可以使用$addField: { a.b: "foo" } 。但是在中间结果上,不允许您执行该操作。有人会觉得这有点矛盾。