У меня есть коллекция деталей студентов, как показано ниже:Объединить массив из встроенного документа на основе состояния в MongoDB
{
"Student_id": 1,
"StudentName": "ABC",
"TestDetails": [{
"SubtestName":"Reading", "TestSeq":1, "SubTestDetails":1,
"Scores":[{"ScoreType":"YY","ScoreValue":"100"},{"ScoreType":"XX","ScoreValue":"100"},
{"ScoreType": "ZZ","ScoreValue":"100"}]}]
,
"TestDetails": [{
"SubtestName":"Writing", "TestSeq":1, "SubTestDetails":2,
"Scores":[{"ScoreType":"YY","ScoreValue":"200"},{"ScoreType":"XX","ScoreValue":"200"},
{"ScoreType": "ZZ","ScoreValue":"200"}]}]
,
"TestDetails": [{
"SubtestName":"Listning", "TestSeq":2, "SubTestDetails":3,
"Scores":[{"ScoreType":"YY","ScoreValue":"300"},{"ScoreType":"XX","ScoreValue":"300"},
{"ScoreType": "ZZ","ScoreValue":"300"}]}]
,
"TestDetails": [{
"SubtestName":"Speaking", "TestSeq":2, "SubTestDetails":4,
"Scores":[{"ScoreType":"YY","ScoreValue":"400"},{"ScoreType":"XX","ScoreValue":"400"},
{"ScoreType": "ZZ","ScoreValue":"400"}]}]
,
"TestDetails": [{
"SubtestName":"Smartness", "TestSeq":3, "SubTestDetails":5,
"Scores":[{"ScoreType":"YY","ScoreValue":"500"},{"ScoreType":"XX","ScoreValue":"500"},
{"ScoreType": "ZZ","ScoreValue":"500"}]}]
},
{
"Student_id": 2,
"StudentName": "XYZ",
"TestDetails": [{
"SubtestName":"Smartness", "TestSeq":1, "SubTestDetails":1,
"Scores":[{"ScoreType":"YY","ScoreValue":"100"},{"ScoreType":"XX","ScoreValue":"100"},
{"ScoreType": "ZZ","ScoreValue":"100"}]}]
,
"TestDetails": [{
"SubtestName":"Writing", "TestSeq":1, "SubTestDetails":2,
"Scores":[{"ScoreType":"YY","ScoreValue":"200"},{"ScoreType":"XX","ScoreValue":"200"},
{"ScoreType": "ZZ","ScoreValue":"200"}]}]
,
"TestDetails": [{
"SubtestName":"Listning", "TestSeq":2, "SubTestDetails":3,
"Scores":[{"ScoreType":"YY","ScoreValue":"300"},{"ScoreType":"XX","ScoreValue":"300"},
{"ScoreType": "ZZ","ScoreValue":"300"}]}]
,
"TestDetails": [{
"SubtestName":"Speaking", "TestSeq":2, "SubTestDetails":4,
"Scores":[{"ScoreType":"YY","ScoreValue":"400"},{"ScoreType":"XX","ScoreValue":"400"},
{"ScoreType": "ZZ","ScoreValue":"400"}]}]
,
"TestDetails": [{
"SubtestName":"Reading", "TestSeq":3, "SubTestDetails":5,
"Scores":[{"ScoreType":"YY","ScoreValue":"100"},{"ScoreType":"XX","ScoreValue":"100"},
{"ScoreType": "ZZ","ScoreValue":"1000"}]}]
},
.
.
.
)
Как я могу создать совокупный запрос для создания документа, как показано ниже:
{Student:1, "TestSeq" : 1, [{Subtest_name: Reading},{Subtest_name: Writing}]},
{Student:1,"TestSeq" : 2, [{Subtest_name: Listning},{Subtest_name: Speaking}]},
{Student:1, "TestSeq" : 3, [{Subtest_name: Smartness}]},
{Student:2, "TestSeq" : 1, [{Subtest_name: Smartness},{Subtest_name: Writing}]},
{Student:2, "TestSeq" : 2, [{Subtest_name: Listning},{Subtest_name: Speaking}]},
{Student:2, "TestSeq" : 3, [{Subtest_name: Reading}]},
{Student:3, "TestSeq" : 1, [{Subtest_name: Subtest1},{Subtest_name: Subtest2}]},
{Student:3, "TestSeq" : 2, [{Subtest_name: Subtest3},{Subtest_name: Subtest4}]},
{Student:3, "TestSeq" : 3, [{Subtest_name: Subtest5}]}
логики является объединение/групповое имя субтеста на основе значений TestSeq. Например, имена подтестов объединяются для TestSeq = 1
, для значения 2 это во 2-й строке и 3 для последнего имени субтеста для каждого учащегося.
Как это реализовать?
Я попытался, как показано ниже -
db.students.aggregate([
{$unwind: "$SubtestAttribs"},
{ $project: { student_name: 1, student_id : 1,
print_ready : "$SubtestAttribs.TestSeq",
Subtest_names :$SubtestAttribs.SubtestName" } } ])
Но я не в состоянии сформировать массив на основе состояния. Над фрагментом, дающим данные для каждого тестового seq. Но как объединить два подтест-теста на основе тестового seq?
Можете ли вы показать нам, что вы пробовали? Мы не очень привыкли писать код для вас. –
db.students.aggregate ([ \t {$ размотки: "$ SubtestAttribs"}, {$ Проект: { student_name: 1, \t student_id: 1, \t print_ready: "$ SubtestAttribs.TestSeq" , Subtest_names: "$ SubtestAttribs.SubtestName" }} ]) Я не в состоянии сформировать массив на основе состояния. выше фрагмента, дающего данные для каждого тестового seq. Но как объединить два подтест-теста на основе тестового seq? –
Измените свой вопрос, чтобы добавить, что –