#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. Спасибо, Том Слабберт, Все работает, как и ожидалось. Большое вам спасибо!!