MongoDB агрегирует несколько массивов объектов на основе общего ключа - PullRequest
0 голосов
/ 29 октября 2019

Я пишу запрос для расчета нескольких показателей для каждого пользователя в моей БД.

Я рассчитал все метрики, и у меня есть такая структура

{  
  "metric1": [{"user_id": 1, "val": 13},{"user_id": 2, "val": 100}],
  "metric2": [{"user_id": 2, "val": 29},{"user_id": 1, "val": 123}],
  "metric3": [{"user_id": 1, "val": 46},{"user_id": 2, "val": 111]
}

Я пытаюсь преобразовать вышеприведенное в эту структуру

{ 
  "user_id": [1,2],
  "metric1": [13, 100],
  "metric2": [29,123],
  "metric3": [46,111]
}

Чтобы я мог отобразить таблицу, показывающую каждого пользователя и три показателя (по одному показателю на столбец и одному пользователю на строку).

1 Ответ

1 голос
/ 29 октября 2019

учитывая, что ваши данные соответствуют тому, что вы сказали:

{
  "metric1": [
    {"id1": 1}, {"id2": 2}
  ],
    "metric2": [
    {"id2": 22}, {"id1": 11}
  ],
    "metric3": [
    {"id2": 222}, {"id1": 111}
  ]
}

все, что вам нужно сделать, это использовать $unwind, чтобы иметь возможность разбить массив, а затем $objectToArray, чтобы получить доступ кключи

db.blah.aggregate([
  { $unwind: '$metric1' },
  { $unwind: '$metric2' },
  { $unwind: '$metric3' },
  { $project: {'metric1': { $objectToArray: '$metric1' }, 'metric2': { $objectToArray: '$metric2' }, 'metric3': { $objectToArray: '$metric3' }} },
  { $sort: { 'metric1.k' : -1} },
  { $sort: { 'metric2.k' : -1} },
  { $sort: { 'metric3.k' : -1} },
  { $unwind: '$metric1' },
  { $unwind: '$metric2' },
  { $unwind: '$metric3' },
  { $group: {
    _id: null,
    user_id: { $addToSet: '$metric1.k' },
    metric1: { $addToSet: '$metric1.v' },
    metric2: { $addToSet: '$metric2.v' },
    metric3: { $addToSet: '$metric3.v' },
  } },
  { $project: { _id: 0 } }
]).pretty()

, что приводит

{
    "user_id" : [
        "id1",
        "id2"
    ],
    "metric1" : [
        1,
        2
    ],
    "metric2" : [
        11,
        22
    ],
    "metric3" : [
        111,
        222
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...