2012-08-22 5 views
0

를 사용하여 MongoDB에 SQL에서 값의 계층 구조를 만들기 내가 함께 사투를 벌인거야 데이터 변환 문제가 집계 프레임 워크

ID PollTitle 창조주 질문 응답 응답자

내가 더 컴팩트 JSON 구조 무슨 생각으로 이러한 변환하려면 :

{ 
ID, 
Poll Title, 
Questions : [ 
    { QuestionTitle, QuestionNumber, Answers : [ 
     { RespondentName, Answer, SubmittedTime } 
     ] 
    ] 
} 
가이것은 레코드 수를 줄이고 Poll -> Questions -> Answers의 자연스러운 계층을 표현하는 더 좋은 방법 인 것처럼 보입니다.

_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 

가 통합 프레임 워크를 사용하여 쿼리 언어로이 작업을 수행하는 방법을 알아 내기 위해 애 쓰고 : 여기에 하나의 설문 조사에 대한 일부 레코드의 예입니다.

+0

$ addToSet 및 $ group을 사용하여이 작업을 수행하는 방법을 알았지 만, 결과는 객체 배열이있는 단일 문서입니다. 각 설문 조사/질문 []에 대해 별도의 기록을 얻을 수 있도록이 방법을 풀려면 어떻게해야합니까? –

+0

변환하기 전에 문서의 예를 게시 할 수 있습니까? – Stennie

+0

컬렉션은 얼마나 큽니까? 집계 프레임 워크의 한계에 부딪 힐 가능성이 있습니다. 최대 16MB의 결과 세트 만 반환 할 수 있습니다. –

답변

0

집계 프레임 워크에서 두 개 이상의 $ 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 
} 

당신은 마지막에 $ 프로젝트를 사용할 수있는 문서의 정확한 형식.

+0

이것은 대단합니다, Asya에게 감사드립니다. 나는이 쿼리가 어떻게 작동하는지 생각할 필요가있다. 한 가지 더 관련된 질문 - 레코드 결과 배열에서 컬렉션으로 이동하는 가장 좋은 방법은 무엇이지만 결과의 개체 당 하나의 레코드가 있습니까? 새 컬렉션에 결과를 저장하려고하면 결과 배열에 하나의 항목 만 얻습니다. 결과를 다시 풀고 싶습니다. –

+0

어떻게 결과를 저장하고 있습니까? r = db.coll.aggregate()를 저장하면 쉘에서 db.res.save (r.result)는 배열의 각 요소를 별도의 문서로 저장합니다. 그 행동은 2.2에서 (방금 발표 된) 새로운 것입니다. –

+0

- 2.1 버전을 사용하고 있습니다. –