Объединить все массивы элементов в коллекции [MongoDB] - PullRequest
3 голосов
/ 04 июня 2019

Извините, у меня плохо получилось агрегирование 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 голосов
/ 04 июня 2019

Агрегация всегда лучше, чем использование какого-либо языкового кода, и поэтому база данных предоставляет такой тип облегчения, чтобы получить результаты за один раз.

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

Единственное, о чем вам нужно позаботитьсяздесь размер возвращаемого результата для одного документа не должен превышать более 16 МБ Bson limit.Больше вы можете узнать у здесь

1 голос
/ 04 июня 2019

Вы можете $ group на null получить массив массивов в виде одного документа, а затем вы можете запустить $ redu с $ concatArrays для выровнять этот массив:

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

Площадка MongoDB

...