2017-04-12 53 views
0

收集:1 - ProductCatalog:聚合/查找功能來獲得型號價格全部上市束的SKU

{ 
    "productId" : "prod0001", 
    "skus" : [ 
     { 
      "skuType" : "Standard", 
      "skuId" : "s00001", 
      "bundleSkus": [ 
       { 
        "bundleSkuId":"bs1001", 
        "displayName":"Service Charge 1" 
       }, 
       { 
        "bundleSkuId":"bs1002", 
        "displayName":"Service Charge 2" 
       } 
      ] 
     }, 
     { 
      "skuType" : "Enhanced", 
      "skuId" : "s00002", 
      "tncUrl" : "./../../../assets/html/prod0001tnc.html", 
      "basicPrice" : "15" 
     }, 
     { 
      "skuType" : "Premium", 
      "skuId" : "s00003", 
      "bundleSkus": [ 
       { 
        "bundleSkuId":"bs2001", 
        "displayName":"Service Charge 1" 
       }, 
       { 
        "bundleSkuId":"bs2002", 
        "displayName":"Service Charge 2" 
       } 
      ] 
     } 
    ] 
} 

收藏:2 - 價目表

{ 
    "bundleSkuId" : "bs1001", 
    "price" : [ 
     { 
      "amount" : 10, 
      "minQty" : 1, 
      "maxQty" : 99999 
     } 
    ]  
}, 
{ 
    "bundleSkuId" : "bs1002", 
    "price" : [ 
     { 
      "amount" : 10, 
      "minQty" : 1, 
      "maxQty" : 99999 
     } 
    ] 
}, 
{ 
    "bundleSkuId" : "bs2001", 
    "price" : [ 
     { 
      "amount" : 15, 
      "minQty" : 1, 
      "maxQty" : 99999 
     } 
    ] 
}, 
{ 
    "bundleSkuId" : "bs2002", 
    "price" : [ 
     { 
      "amount" : 20, 
      "minQty" : 1, 
      "maxQty" : 1000 
     }, 
     { 
      "amount" : 19, 
      "minQty" : 1001, 
      "maxQty" : 99999 
     } 
    ] 
} 

我是新來蒙戈db和我有以下要求。 預期結果: 需要一個基於來自兩個表的bundleSkuId從PriceList集合中獲取所有bundleskus價格的MongoDB集合/查找(這種可能性)函數。

我很驚訝這一要求,有些人的幫助是高度讚賞。

+0

https://docs.mongodb.com/manual/reference/operator/aggregation/查詢/ –

+0

嗨,亞歷克斯,感謝您的意見。我按照你的建議嘗試了,但給了我新添加的屬性的空數組。這對於簡單的JSON工作正常,但在我的情況下 - dcm代碼是在一個數組bundlesku下,這是一個更多的數組skus因此我得到的數組大小爲0,根據我的理解。任何輸入/建議。 – yuvan

回答

0

首先使用$unwind來解構ProductCatalog中的skus數組。

db.ProductCatalog.aggregate([{$unwind: '$skus'}, {$unwind: '$skus.bundleSkus'}]) 
{ "_id" : ObjectId("58ee87f6bea70e6b45fde632"), "productId" : "prod0001", "skus" : { "skuType" : "Standard", "skuId" : "s00001", "bundleSkus" : { "bundleSkuId" : "bs1001", "displayName" : "Service Charge 1" } } } 
{ "_id" : ObjectId("58ee87f6bea70e6b45fde632"), "productId" : "prod0001", "skus" : { "skuType" : "Standard", "skuId" : "s00001", "bundleSkus" : { "bundleSkuId" : "bs1002", "displayName" : "Service Charge 2" } } } 
{ "_id" : ObjectId("58ee87f6bea70e6b45fde632"), "productId" : "prod0001", "skus" : { "skuType" : "Premium", "skuId" : "s00003", "bundleSkus" : { "bundleSkuId" : "bs2001", "displayName" : "Service Charge 1" } } } 
{ "_id" : ObjectId("58ee87f6bea70e6b45fde632"), "productId" : "prod0001", "skus" : { "skuType" : "Premium", "skuId" : "s00003", "bundleSkus" : { "bundleSkuId" : "bs2002", "displayName" : "Service Charge 2" } } } 

然後用$lookup與價目表

db.ProductCatalog.aggregate([{$unwind: '$skus'}, {$unwind: '$skus.bundleSkus'}, {$lookup: {from: 'PriceList', as: 'price', localField: "skus.bundleSkus.bundleSkuId", foreignField: 'bundleSkuId'}}]) 
{ "_id" : ObjectId("58ee87f6bea70e6b45fde632"), "productId" : "prod0001", "skus" : { "skuType" : "Standard", "skuId" : "s00001", "bundleSkus" : { "bundleSkuId" : "bs1001", "displayName" : "Service Charge 1" } }, "price" : [ { "_id" : ObjectId("58ee8815bea70e6b45fde633"), "bundleSkuId" : "bs1001", "price" : [ { "amount" : 10, "minQty" : 1, "maxQty" : 99999 } ] } ] } 
{ "_id" : ObjectId("58ee87f6bea70e6b45fde632"), "productId" : "prod0001", "skus" : { "skuType" : "Standard", "skuId" : "s00001", "bundleSkus" : { "bundleSkuId" : "bs1002", "displayName" : "Service Charge 2" } }, "price" : [ { "_id" : ObjectId("58ee8815bea70e6b45fde634"), "bundleSkuId" : "bs1002", "price" : [ { "amount" : 10, "minQty" : 1, "maxQty" : 99999 } ] } ] } 
{ "_id" : ObjectId("58ee87f6bea70e6b45fde632"), "productId" : "prod0001", "skus" : { "skuType" : "Premium", "skuId" : "s00003", "bundleSkus" : { "bundleSkuId" : "bs2001", "displayName" : "Service Charge 1" } }, "price" : [ { "_id" : ObjectId("58ee8815bea70e6b45fde635"), "bundleSkuId" : "bs2001", "price" : [ { "amount" : 15, "minQty" : 1, "maxQty" : 99999 } ] } ] } 
{ "_id" : ObjectId("58ee87f6bea70e6b45fde632"), "productId" : "prod0001", "skus" : { "skuType" : "Premium", "skuId" : "s00003", "bundleSkus" : { "bundleSkuId" : "bs2002", "displayName" : "Service Charge 2" } }, "price" : [ { "_id" : ObjectId("58ee8815bea70e6b45fde636"), "bundleSkuId" : "bs2002", "price" : [ { "amount" : 20, "minQty" : 1, "maxQty" : 1000 }, { "amount" : 19, "minQty" : 1001, "maxQty" : 99999 } ] } ] } 

加入可以清理一個最終$project

+0

謝謝Julien。你的解決方案幫了我。這裏只是一個小的查詢 - 我能夠在數據庫中查看記錄,但無法在上面打開所有記錄。我只能打開一條記錄 - 如果我點擊第二條記錄,它將默認轉到第一條記錄。這是真實的行爲嗎?或者我們是否需要修改查詢來編輯所有記錄? – yuvan

+0

它似乎是一個GUI問題。也許它使用的是你的文檔的_id,而不是你的示例中設置的 –