2015-11-25 4 views
0

У меня есть коллекция деталей студентов, как показано ниже:Объединить массив из встроенного документа на основе состояния в 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?

+0

Можете ли вы показать нам, что вы пробовали? Мы не очень привыкли писать код для вас. –

+0

db.students.aggregate ([ \t {$ размотки: "$ SubtestAttribs"}, {$ Проект: { student_name: 1, \t student_id: 1, \t print_ready: "$ SubtestAttribs.TestSeq" , Subtest_names: "$ SubtestAttribs.SubtestName" }} ]) Я не в состоянии сформировать массив на основе состояния. выше фрагмента, дающего данные для каждого тестового seq. Но как объединить два подтест-теста на основе тестового seq? –

+0

Измените свой вопрос, чтобы добавить, что –

ответ

1

Примечание: Я делаю пару допущений, потому что ваш вопрос содержит в себе некоторые незаконные JSON. Дайте мне знать, если я ошибаюсь. Кроме того, я сейчас не на компьютере с Mongo, поэтому у меня могут быть некоторые проблемы с синтаксисом.

db.students.aggregate([ 
{ $unwind: "$TestDetails" }, 
{ 
    $group:{ 
     _id: { Student: "$Student_id", TestSeq: "$TestDetails.TestSeq}, 
     Subtest_names: { $addToSet: "$TestDetails.Subtestname" } 
    } 
}, 
{ 
    $project:{ 
     Student: "$_id.Student", 
     TestSeq: "$_id.TestSeq, 
     Subtest_names: "$Subtest_names" 
    } 
} 
]) 
+0

Отдала бы его вам, поскольку '$ addToSet' здесь более уместен, чем' $ push', поэтому +1 от меня, даже если JSON OP недействителен :) – chridam

+0

Оценил вашу помощь. Я проверю и дам вам знать. –

+0

Я получаю ниже o/p - {"_id": {"Student": 2, "TestSeq": 3}, "Subtest_names": ["Чтение"], "Студент": 2, "TestSeq": 3} {"_id": {"Студент": 1, "TestSeq": 3}, "Subtest_names": ["Smartness"], "Student": 1, "TestSeq": 3} ..... Здесь я получение одной информации для каждого студента, в то время как мне нужно найти список подтест-имен, основанных на каждом испытании seq. –

Смежные вопросы