Слияние / объединение нескольких документов в MongoDB - PullRequest
0 голосов
/ 10 ноября 2019


У меня небольшая проблема с агрегацией. У меня есть большая коллекция плоских документов со следующей схемой:

{
  _id:ObjectId("5dc027d38da295b969eca568"),
  emp_no:10001,
  salary:60117,
  from_date:"1986-06-26",
  to_date:"1987-06-26"
}

Все дело в годовой зарплате сотрудника. Данные экспортируются из реляционной базы данных, поэтому существует несколько документов с одинаковым значением "emp_no" , но остальные их атрибуты различаются. Мне нужно агрегировать их по значениям атрибута "emp_no", поэтому в результате у меня будет что-то вроде этого:

//one document
{
  _id:ObjectId("5dc027d38da295b969eca568"),
  emp_no:10001,
  salaries: [
    {
      salary:60117,
      from_date:"1986-06-26",
      to_date:"1987-06-26"
    },
    {
      salary:62102,
      from_date:"1987-06-26",
      to_date:"1988-06-25"
    },
    ...
  ]
}

//another document
{
  _id:ObjectId("5dc027d38da295b969eca579"),
  emp_no:10002,
  salaries: [
    {
      salary:65828,
      from_date:"1996-08-03",
      to_date:"1997-08-03"
    },
    ...
  ]
}

//and so on

И последнее, но не менее важное: почти 2,9 млн документов агрегируются по "emp_no " вручную было бы небольшой проблемой.
Есть ли способ объединить их, используя только монго запросы? Как мне делать такие вещи? Заранее благодарю за любую помощь

1 Ответ

0 голосов
/ 11 ноября 2019

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

Как работает приведенный ниже запрос?

db.collection.aggregate([
  {
    "$group": {
      "_id": "$emp_no",
      "salaries": {
        "$push": {
          "salary": "$salary",
          "from_data": "$from_date",
          "to_data": "$to_date"
        }
      },
      "emp_no": {
        "$first": "$emp_no"
      },
      "first_document_id": {
        "$first": "$_id"
      }
    }
  },
  {
    "$project": {
      "_id": "$first_document_id",
      "salaries": 1,
      "emp_no": 1
    }
  }
])
...