이 질문은 이전에 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
쿼리를 추가하려고하지만 이는 실제로 내 질문의 일부가 아닙니다.
그냥 명확히하기 위해 시도; '$ unwind' 파이프 라인을 적용하여 "attendees.contact"필드에'$ lookup' 연산자를 적용하고'$ lookup' 다음에 또 다른'$ unwind' 파이프를 적용하기 위해 임베디드 문서의 배열을 평평하게 할 필요가 있습니다 그리고'$ group'을 사용하여 원하는 출력을 얻습니다. 다가오는 MongoDB 3.4를 사용하고 있다면 또 다른 대답이 적용됩니다. – chridam
좋아요, 그래서 당신이 말하는 것은 내가 먼저 {{ "$ unwind": "$ attendees"}', {{ "$ lookup": { from ":"contactlist "}}}',"{ "$ unwind": "$ contactlist"} "다음과 같이 입력하십시오 :" "contact", "localField": "attendees.contact", "foreignField": "_id" 그리고'$ group'? –
수정. 파이프 라인을 디버깅하는 팁. 각 파이프 라인 단계에서 집계 쿼리를 실행하고 결과가 각 단계마다 계산되는지 테스트하십시오. 예를 들어, 위의 집계에서, 먼저 db.event.aggregate ([{ "$ unwind": "$ attendees"}]);'를 실행하여 결과를 확인하여 참석자 배열이 올바르게 해체되었는지 확인하고, 다음 파이프 라인 스테이지'dbevent.aggregate ({{ "$ unwind": "$ attendees"}, { "$ lookup": { "from": "Contact", "localField": "attendees.contact", "foreignField ":"_id ","as ":"contactlist "}});'를 실행하고 최종 파이프 라인 단계에 도달 할 때까지 단계를 반복하십시오. – chridam