Mongodb 2个集合之间的聚合/查找功能,以获取列出的所有捆绑Sku的Sku价格

Mongodb 2个集合之间的聚合/查找功能,以获取列出的所有捆绑Sku的Sku价格,mongodb,Mongodb,收藏:1-产品目录: { "productId" : "prod0001", "skus" : [ { "skuType" : "Standard", "skuId" : "s00001", "bundleSkus": [ { "bundleSkuId":"bs1001", "dis

收藏:1-产品目录:

{
    "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.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 } ] } ] }
我是mongo db的新手,我有以下要求。 预期结果: 需要一个MongoDB aggregate/lookup(可能的话)函数,该函数将根据两个表中的bundleSkuId从PriceList集合中获取所有Bundlesku的价格

我对这个要求印象深刻,非常感谢您的帮助。

首先在ProductCatalog中使用它来分解SKU阵列

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" } } }
然后使用加入PriceList

{
    "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.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 } ] } ] }

您可以通过期末考试来进行清理

嗨,Alex,谢谢您的输入。我按照您的建议尝试了,但为新添加的属性提供了空数组。这对于简单的JSON来说很好,但在我的例子中-dcm代码在一个数组bundlesku下,该数组bundlesku在一个或多个数组SKU下,因此根据我的理解,我得到的数组大小为0。任何意见/建议。谢谢你,朱利安。你的解决方案帮助了我。这里只是一个小查询-我可以看到数据库中的记录,但无法打开上面的所有记录。我只能打开一条记录——如果我点击第二条记录,它将默认进入第一条记录。这是真实的行为吗?或者我们需要修改查询来编辑所有记录吗?这似乎是一个GUI问题。可能是使用了样本中未设置的文档的_id