$ concatArrays在现有的多数组字段上不起作用

时间:2019-08-19 18:19:39

标签: mongodb aggregation-framework

我有此示例文档,其键值设置为数组数组。

{ _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

2 个答案:

答案 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"] }
      }
    }
  }}
])

MongoPlayground