我有此示例文档,其键值设置为数组数组。
{ _id: 1, items: [ [1, 2, 3], [4, 5, 6] ] }
这是我的聚合函数
db.collection.aggregate([
{ $project: { items: { $concatArrays: "$items" } } }
])
结果应为:
{ _id: 1, items: [1, 2, 3, 4, 5, 6] }
但是结果是:
{ _id: 1, items: [ [1, 2, 3], [4, 5, 6] ] }
是否有另一种方式来获得所需的输出?我知道我可以使用lodash
_.flattenDeep(items)
,但我正在寻找mongodb解决方案。
这是我的mongo Playground
答案 0 :(得分:2)
我已经看到你已经得到了答案,但我将简要解释为什么任何好奇的人都会出现这种行为。
这实际上是 Mongo 的一个“功能”,有一个开放的 feature change request 可以跟踪。但首先让我们了解什么是causing:
<块引用>有一类表达式可以接受多个参数,表示为数组。 (在代码中,这些继承自 ExpressionNary。)对于任何这样的 n-ary 表达式,我将称之为 $nary,语法 {$nary: "$myArg"} 只是 {$nary: ["$myArg "]}。这两个表达的意思相同。
所以这一类独特的表达式包括许多运算符,其中之一是 $concatArrays。 Mongo 的表达式语言只是将这些运算符的任何 '$arg' 解析为 ['$arg']。
这就是为什么在您使用 $dups
表达式时会发生“意外”行为,而在您明确写入相同值时不会发生的原因。
答案 1 :(得分:1)
您可以使用以下汇总
db.collection.aggregate([
{ "$project": {
"items": {
"$reduce": {
"input": "$items",
"initialValue": [],
"in": { "$concatArrays": ["$$this", "$$value"] }
}
}
}}
])