Создайте иерархию значений из SQL в MongoDB, используя структуру агрегации
У меня проблема с преобразованием данных, с которой я борюсь:
Предположим, у меня есть набор вопросов и ответов из опросов, загруженных в монго формы
ID PollTitle Creator Вопрос Ответ Респондент
Я хочу преобразовать их в более компактную структуру JSON:
{
ID,
Poll Title,
Questions : [
{ QuestionTitle, QuestionNumber, Answers : [
{ RespondentName, Answer, SubmittedTime }
]
]
}
похоже, что это был бы лучший способ уменьшить количество записей и представить естественную иерархию Опрос -> Вопросы -> Ответы. Вот пример некоторых записей для одного опроса:
_id Poll ID Poll Title Creator Question Quest# Responder Answer Response Time
742888 9258 Daily Checkin Mike Was it a good meeting 1 John Yes 8/16
742889 9258 Daily Checkin Mike Was it a good meeting 1 Len No 8/16
742890 9258 Daily Checkin Mike Do you agree with goal 2 John Yes 8/16
742891 9258 Daily Checkin Mike Do you agree with goal 2 Len Yes 8/16
пытается выяснить, как это сделать на языке запросов с использованием структуры агрегации.
1 ответ
Вы должны сделать более одного шага $group в структуре агрегации.
Вот как это будет выглядеть на примере ваших данных и на выходе, который вы получите:
db.poll.aggregate(
[
{
"$group" : {
"_id" : {
"ID" : "$ID",
"title" : "$title",
"QuestionTitle" : "$question",
"QuestionNumber" : "$questionNum"
},
"answer" : {
"$push" : {
"responder" : "$responder",
"Answer" : "$answer",
"respTime" : "$respTime"
}
}
}
},
{
"$group" : {
"_id" : {
"ID" : "$_id.ID",
"title" : "$_id.title"
},
"Questions" : {
"$push" : {
"QuestionTitle" : "$_id.QuestionTitle",
"QuestionNumber" : "$_id.questionNumber",
"Answers" : "$answer"
}
}
}
}
])
{
"result" : [
{
"_id" : {
"ID" : 9258,
"title" : "Daily Checkin"
},
"Questions" : [
{
"QuestionTitle" : "Do you agree with goal",
"Answers" : [
{
"responder" : "John",
"Answer" : "Yes",
"respTime" : "8/16"
},
{
"responder" : "Len",
"Answer" : "Yes",
"respTime" : "8/16"
}
]
},
{
"QuestionTitle" : "Was it a good meeting",
"Answers" : [
{
"responder" : "John",
"Answer" : "Yes",
"respTime" : "8/16"
},
{
"responder" : "Len",
"Answer" : "No",
"respTime" : "8/16"
}
]
}
]
}
],
"ok" : 1
}
Вы можете использовать $project в конце, если хотите переименовать любое из полей или иным образом преобразовать точный формат документа.