从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/

10-12 03:24