Увязка с вложенной группировкой в MongoDB

#mongodb #mongodb-query

Вопрос:

Я пытаюсь реализовать вложенный групповой запрос в mongodb и застрял.

Документы моей коллекции выглядят так.

 [
    {
        '_id': ObjectId('6171377e78671af1ae78f35a'),
        'state': 'SA',
        'term': 1,
        'year': '2021',
        'dateRange': [
            '2019/01/29',
            '2019/04/12',
        ],
    },
    {
        '_id': ObjectId('6171377e78671af1ae78f35a'),
        'state': 'SA',
        'term': 2,
        'year': '2021',
        'dateRange': [
            '2019/01/29',
            '2019/04/12',
        ],
    },
    {
        '_id': ObjectId('6171377e78671af1ae78f35b'),
        'state': 'SA',
        'term': 1,
        'year': '2022',
        'dateRange': [
            '2019/04/29',
            '2019/07/05',
        ],
    },
    {
        '_id': ObjectId('6171377e78671af1ae78f35b'),
        'state': 'TAS',
        'term': 1,
        'year': '2021',
        'dateRange': [
            '2019/04/29',
            '2019/07/05',
        ],
    },
];
 

Я пытаюсь составить список следующих дат срока (группируйте даты срока по годам в каждом штате), но понятия не имею, как этого добиться.

 [
    {
        state: 'SA',
        termdates: [
            {
                year: '2021',
                data: [
                    {
                        term: 1,
                        dateRange: [
                            '2019/01/29',
                            '2019/04/12',
                        ],
                    },
                    {
                        term: 2,
                        dateRange: [
                            '2019/01/29',
                            '2019/04/12',
                        ],
                    },
                ],
            },
            {
                year: '2022',
                data: [
                    {
                        term: 1,
                        dateRange: [
                            '2019/01/29',
                            '2019/04/12',
                        ],
                    },
                ],
            },
        ],
    },
    {
        state: 'TAS',
        termdates: [
            {
                year: '2021',
                data: [
                    {
                        term: 1,
                        dateRange: [
                            '2019/01/29',
                            '2019/04/12',
                        ],
                    },
                ],
            },
        ],
    },
];
 

Не могли бы вы, ребята, пожалуйста, помочь мне с этим. Как я могу достичь этого результата.
Заранее спасибо!!

Комментарии:

1. Почему у вас есть пустой массив termdates: [] для state: 'TAS' ? Хранение значений даты/времени в виде строки является недостатком дизайна, всегда храните правильные Date объекты.

Ответ №1:

То, что вы хотите сделать $group year x state , — это сначала создать «вложенное» data поле. Затем $group снова просто state создайте окончательную структуру, вот так:

 db.collection.aggregate([
  {
    $group: {
      _id: {
        state: "$state",
        year: "$year",
        
      },
      data: {
        $push: {
          term: "$term",
          dateRange: "$dateRange"
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.state",
      termdates: {
        $push: {
          year: "$_id.year",
          data: "$data"
        }
      }
    }
  }
])
 

Игровая площадка Монго

Комментарии:

1. Спасибо, Том Слабберт, Все работает, как и ожидалось. Большое вам спасибо!!