2017-10-06 7 views
1

이는 '기업'콜렉션 데이터

{ 
    _id: "1", 
    company: "ABC", 
    addresses: [ 
    { 
     _id: "2", 
     address: "a1", 
     district: "d1", 
     city: "c1" 
    }, 
    { 
     _id: "3", 
     address: "a2", 
     district: "d2", 
     city: "c2" 
    }, 
    { 
     _id: "4", 
     address: "a3", 
     district: "d3", 
     city: "c3" 
    } 
    ] 
} 

이것은

{ 
    product: "xyz", 
    companyid: "1",   //_id of record in company's collection 
    addresses: ["2", "4"] //addresses _id of record in company's collection 
}, 
{ 
    product: "pqr", 
    companyid: "1", 
    addresses: ["3", "4"] 
} 

지금 내가 좋아하는 모든 회사와 제품 및 주소를 얻을 필요 '제품'콜렉션 데이터입니다 아래

{ 
    product: "xyz", 
    company: "ABC", 
    addresses: [ 
    { 
     _id: "2", 
     address: "a1", 
     district: "d1", 
     city: "c1" 
    }, 
    { 
     _id: "4", 
     address: "a3", 
     district: "d3", 
     city: "c3" 
    } 
    ] 
}, 
{ 
    product: "pqr", 
    companyid: "ABC", 
    addresses: [ 
    { 
     _id: "3", 
     address: "a2", 
     district: "d2", 
     city: "c2" 
    }, 
    { 
     _id: "4", 
     address: "a3", 
     district: "d3", 
     city: "c3" 
    } 
    ] 
} 

배열이 있으면 제품에만 $ unwind하고 lookup을 수행 할 수 있습니다. 그러나이 조건에서 두 컬렉션 모두에 배열이 있습니다. 그런 다음 어떻게 비교하고 $ lookup을 사용하여 예상 출력을 얻을 수 있습니까? 다른 대안이 있다면 알려 주시기 바랍니다.

답변

2

당신이 원하는 결과를 얻기 위해 다음과 같은 집계 작업을 실행 시도 할 수 있습니다 : $ setIsSubset의

db.product.aggregate([ 
    { 
     "$lookup": { 
      "from": "company", 
      "localField": "companyid", 
      "foreignField": "_id", 
      "as": "company" 
     } 
    }, 
    { 
     "$addFields": { 
      "company": { "$arrayElemAt": ["$company", 0] } 
     } 
    }, 
    { 
     "$addFields": {    
      "addresses": { 
       "$filter": { 
        "input": "$company.addresses", 
        "as": "ad", 
        "cond": { 
         "$setIsSubset": [ 
          ["$$ad._id"], 
          "$addresses" 
         ] 
        } 
       } 
      } 
     } 
    }, 
    { "$project": { "company": 0 } } 
]) 
+1

위대한 사용. –