2016-11-15 10 views
0

이 질문은 이전에 this question의 중복으로 표시되었습니다. 나는 그것이 확실하지 않다는 것을 확신 할 수 있습니다.

문제의 요소가 배열이 아니고 배열의 개별 개체에 필드로 포함되어 있기 때문에 연결된 질문과 중복되지 않습니다. 나는 연결된 질문의 쿼리가 어떻게 작동해야하는지 완전히 알고 있지만 시나리오는 내 것과 다릅니다.

MongoDb에 대한 $lookup 질문과 관련하여 질문이 있습니다. 다음과 같이 내 데이터 구조는 같습니다

"이벤트" 컬렉션이 하나의 문서가 포함되어 내 "연락처" 컬렉션이 문서에 포함

{ 
    "_id": ObjectId("mongodbobjectid..."), 
    "name": "Some Event", 
    "attendees": [ 
     { 
      "type": 1, 
      "status": 2, 
      "contact": ObjectId("mongodbobjectidHEX1") 
     }, 
     { 
      "type": 7, 
      "status": 4, 
      "contact": ObjectId("mongodbobjectidHEX2") 
     } 
    ] 
} 

:

{ 
    "_id": ObjectId("mongodbobjectidHEX1"), 
    "name": "John Doe", 
    "age": 35 
}, 
{ 
    "_id": ObjectId("mongodbobjectidHEX2"), 
    "name": "Peter Pan", 
    "age": 60 
} 

를 내가 원하는 경우 $lookup 연산자로 aggregate 쿼리를 수행하고 "이벤트" 컬렉션 전체 "접촉"데이터와 함께 다음과 같은 결과를 얻을 :

{ 
    "_id": ObjectId("mongodbobjectid..."), 
    "name": "Some Event", 
    "attendees": [ 
     { 
      "type": 1, 
      "status": 2, 
      "contact": { 
       "_id": ObjectId("mongodbobjectidHEX1"), 
       "name": "John Doe", 
       "age": 35 
      } 
     }, 
     { 
      "type": 7, 
      "status": 4, 
      "contact": { 
       "_id": ObjectId("mongodbobjectidHEX2"), 
       "name": "Peter Pan", 
       "age": 60 
      } 
     } 
    ] 
} 

나는 "연락처"다른 문서에서 참조하지만 배열에 포함하지 않을 때의 하나의 요소와 같은 했어요. 나는 위의 결과를 얻기 위해을 전달하는 파이프 라인 인수가 확실하지 않은 입니까?

또한 데이터를 필터링하기 위해 파이프 라인에 $match 쿼리를 추가하려고하지만 이는 실제로 내 질문의 일부가 아닙니다.

+1

그냥 명확히하기 위해 시도; '$ unwind' 파이프 라인을 적용하여 "attendees.contact"필드에'$ lookup' 연산자를 적용하고'$ lookup' 다음에 또 다른'$ unwind' 파이프를 적용하기 위해 임베디드 문서의 배열을 평평하게 할 필요가 있습니다 그리고'$ group'을 사용하여 원하는 출력을 얻습니다. 다가오는 MongoDB 3.4를 사용하고 있다면 또 다른 대답이 적용됩니다. – chridam

+0

좋아요, 그래서 당신이 말하는 것은 내가 먼저 {{ "$ unwind": "$ attendees"}', {{ "$ lookup": { from ":"contactlist "}}}',"{ "$ unwind": "$ contactlist"} "다음과 같이 입력하십시오 :" "contact", "localField": "attendees.contact", "foreignField": "_id" 그리고'$ group'? –

+0

수정. 파이프 라인을 디버깅하는 팁. 각 파이프 라인 단계에서 집계 쿼리를 실행하고 결과가 각 단계마다 계산되는지 테스트하십시오. 예를 들어, 위의 집계에서, 먼저 db.event.aggregate ([{ "$ unwind": "$ attendees"}]);'를 실행하여 결과를 확인하여 참석자 배열이 올바르게 해체되었는지 확인하고, 다음 파이프 라인 스테이지'dbevent.aggregate ({{ "$ unwind": "$ attendees"}, { "$ lookup": { "from": "Contact", "localField": "attendees.contact", "foreignField ":"_id ","as ":"contactlist "}});'를 실행하고 최종 파이프 라인 단계에 도달 할 때까지 단계를 반복하십시오. – chridam

답변

0

그 속는 사람의 대답은 여전히 ​​귀하의 질문에 적용하기 때문에 중복으로 표시이 하나

db.getCollection('Event').aggregate([{ "$unwind": "$attendees" }, 
     { "$lookup" : { "from" : "Contact", "localField" : "attendees.contact", "foreignField": "_id", "as" : "contactlist" } }, 
     { "$unwind": "$contactlist" }, 
     { "$project" :{ 
        "attendees.type" : 1, 
        "attendees.status" : 1, 
        "attendees.contact" : "$contactlist", 
         "name": 1, "_id": 1 
         } 
     }, 
     { 
      "$group" : { 
       _id : "$_id" , 
       "name" : { $first : "$name" }, 
       "attendees" : { $push : "$attendees" } 
      } 
     } 
     ]) 
+0

이 쿼리는 원하는 결과를 반환하지만 "참석자"배열에 반환 된 문서에는 필드 (연락처, 유형, ... 등)가 없습니다. 무슨 일이 일어날 지 아십니까? –

+0

이 쿼리로 얻은 정보를 알려주시겠습니까? –