在一个集合中连接元素的所有数组 [MongoDB]

4

抱歉,我没有很好地理解MongoDB聚合。如何使用聚合实现以下功能:

[
  {array: [1,2,3] },
  {array: [4,5,6] },
  {array: [7,8,9] }
]


desired result:
[1,2,3,4,5,6,7,8,9]

如果我将MongoDB聚合替换为将文档视为普通对象,性能会有所改变吗?

2个回答

2

聚合总是比使用某些语言代码更好,因此数据库提供了这种类型的便利,以一次性获取结果。

原始答案翻译成“最初的回答”。

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "data": { "$push": "$array" }
  }},
  { "$project": {
    "_id": 0,
    "data": {
      "$reduce": {
        "input": "$data",
        "initialValue": [],
        "in": { "$concatArrays": ["$$this", "$$value"] }
      }
    }
  }}
])

你需要注意的仅仅是返回的单个文档结果大小不要超过16MB的Bson限制。更多信息请参考这里。最初的回答中有详细解释。

非常感谢您和@mickl。在我的项目中,我将数组分成几个文档,只是为了避免16MB的限制。因此,我相信数组会超出限制。所以对于我的情况,最好使用一些语言代码? - Niccolò Caselli
1
是的,它可以,但在我看来,16 MB 不是一个小单位。 - Ashh

1
你可以通过使用null$group进行分组,以获取数组的数组作为单个文档,然后你可以使用$concatArrays运行$reduce来展开该数组:
db.col.aggregate([
    {
        $group: {
            _id: null,
            array: { $push: "$array" }
        }
    },
    {
        $project: {
            _id: 0,
            array: {
                $reduce: {
                    input: "$array",
                    initialValue: [],
                    in: { $concatArrays: [ "$$value", "$$this" ] }
                }
            }
        }
    }
])

MongoDB Playground

的英译中文为:

{{链接1:MongoDB Playground}}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接