2017-10-06 43 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" 
    } 
    ] 
} 

如果有數組,只有在產品中,我們可以放開它們並執行查找。但是在這種情況下,兩個集合中都有數組,那麼我們如何比較它們或使用$ lookup來獲得預期的輸出?如果有其他選擇,請告訴我。

回答

2

你可以嘗試運行下面的總操作以獲取所需的結果:

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

大使用$ setIsSubset的。 –

相關問題