Задать вопрос
@kvaak
FE

Как в mongodb объединить значения документов в один массив?

Пытаюсь разобраться, как можно взаимодействовать с данными в mongo и трансформировать ответ по своему усмотрению.

Например, есть данные на вход. foo - массив чисел, bar - опциональное число
{ _id : 0, foo: [], bar: 1 },
    { _id : 1, foo: [2, 3], bar: 4 },
    { _id : 3, foo: [5, 6], bar: undefined }


Задача - объединить эти значения и представить в плоском виде в одном массиве.
То есть на выходе ожидаю
[1, 2, 3, 4, 5, 6]

Есть ли изящный способ это сделать? Если я понимаю правильно, есть механизмы аггрегации, но как их готовить, пока не понимаю. Буду горячо признателен за ответ хотя бы с кратким объяснением действия. Спасибо
  • Вопрос задан
  • 759 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
hzzzzl
@hzzzzl
без аггрегации никуда
вот, собрал в mongo compass

db.collection.aggregate([
  {
    '$addFields': {   // новое поле nums
      'nums': {
        '$concatArrays': [  // соберем из foo bar
          '$foo', [ '$bar' ]
        ]
      }
    }
  }, {
    '$project': {  // только оно нам нужно
      'nums': 1
    }
  }, {
    '$unwind': {  // ВСЕ номера
      'path': '$nums'
    }
  }, {
    '$match': {  // уберем пустые строки и null и прочий мусор
      'nums': {
        '$type': 'number'
      }
    }
  }, {
    '$group': {  // addToSet то есть только уникальные
      '_id': null, 
      'nums': {
        '$addToSet': '$nums'
      }
    }
  }, {  // здесь можно остановиться
    '$unwind': {  // дальше только чтобы отсортировать, потому что сет не будет отсортирован
      'path': '$nums'
    }
  }, {
    '$sort': {
      'nums': 1
    }
  }, {
    '$group': {
      '_id': null, 
      'nums': {
        '$push': '$nums'
      }
    }
  }
])


5f1b310a5df58208046016.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы