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