MongoDB展平任意嵌套数组

MongoDB展平任意嵌套数组,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个具有任意嵌套数组的文档结构,类似于以下内容,我希望在聚合管道期间将其展平: { 数据:[ 一 [ 二 三 ], [ [4],, [五] ] ] } 预期结果: {数据:[一,二,三,四,五]} 现有的问题给出了一些想法,特别是答案,但并非完全具有任意嵌套深度 是否有更通用的解决方案?MongoDB不提供任何循环或递归,因此任意多次执行任何操作都是不可能的 您可以通过编程方式在客户机中构建一个聚合管道,该管道可以将数组展平几十层,但整个管道必须适合16MB的请求文档,因此它不支持任意深度

我有一个具有任意嵌套数组的文档结构,类似于以下内容,我希望在聚合管道期间将其展平:

{ 数据:[ 一 [ 二 三 ], [ [4],, [五] ] ] } 预期结果:

{数据:[一,二,三,四,五]} 现有的问题给出了一些想法,特别是答案,但并非完全具有任意嵌套深度


是否有更通用的解决方案?

MongoDB不提供任何循环或递归,因此任意多次执行任何操作都是不可能的


您可以通过编程方式在客户机中构建一个聚合管道,该管道可以将数组展平几十层,但整个管道必须适合16MB的请求文档,因此它不支持任意深度。

MongoDB不提供任何循环或递归,因此,任意多次地做任何事情都是不可能的

您可以通过编程方式在客户端中构建聚合管道,使阵列平坦几十层,但整个管道必须适合16MB的请求文档,因此它不支持任意深度。

我同意@Joe的观点,在MongoDB中没有直接的方法来处理这种操作,您应该根据查询需求考虑模式设计

如果你认为你真的需要它,你可以试试MongoDB用JavaScript定义一个自定义聚合函数或表达式,​ 以及

重要的

在聚合表达式中执行JavaScript可能会降低性能。仅当提供的管道操作符无法满足应用程序的需要时,才使用$function操作符

我同意@Joe的观点,在MongoDB中没有直接的方法来处理这种操作,您应该根据您的查询需求考虑您的模式设计

如果你认为你真的需要它,你可以试试MongoDB用JavaScript定义一个自定义聚合函数或表达式,​ 以及

重要的

在聚合表达式中执行JavaScript可能会降低性能。仅当提供的管道操作符无法满足应用程序的需要时,才使用$function操作符

{
  $project: {
​    data: {
      ​$function: {
        ​body: function(data) {
          ​const flatten = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);
          ​return flatten(data);
        ​},
        ​args: ["$data"],
        ​lang: "js"
      ​}
    ​}
  ​}
​}