如何在side数组中使用数组和数组的聚合单个查询来获取mongodb的详细信息?

时间:2017-04-05 10:02:09

标签: mongodb aggregation-framework lookup

我想在mongodb上的三个表中使用聚合查询, 我列出了三个存储数据库数据的表,然后我发给你使用的查询, 但输出没有得到我想要的。

订购表

在订单表中,我有一个创建订单,在该对象中有“订单明细”

"order_details":[

{
    "product_unique_id" : 10
    "items":[
    {
        "item_unique_id" : 1
        "quantity":2,
    },
    {
        "item_unique_id" : 2
        "quantity":4,
    }
    ]
},
{
    "product_unique_id" : 11
    "items":[
    {
        "item_unique_id" : 1
        "quantity":1,
    },
    {
        "item_unique_id" : 3
        "quantity":3,
    },
    {
        "item_unique_id" : 4 
        "quantity":2,
    }
    ]
}
]

产品表

Data 1 =>  {"unique_id":10, "product_name":"Product10", "product_visible":true}
Data 2 =>  {"unique_id":11, "product_name":"Product11", "product_visible":false}
Data 3 =>  {"unique_id":12, "product_name":"Product13", "product_visible":true}
... up to N

项目表

Data 1 =>  {"unique_id":1, "item_name":"Item1", "price":17}
Data 2 =>  {"unique_id":2, "item_name":"Item2", "price":9}
Data 3 =>  {"unique_id":3, "item_name":"Item3", "price":34}
Data 4 =>  {"unique_id":4, "item_name":"Item4", "price":78}
Data 5 =>  {"unique_id":5, "item_name":"Item5", "price":26}

我想在订单表中运行聚合查询,并希望响应如下

输出我想要

"order_details":[
{
    "product_unique_id" : 10,
    "product_detail": {"unique_id":10, "product_name":"Product10", "product_visible":true},
    "items":[
    {
        "item_unique_id" : 1
        "quantity":2,
        "item_details":{"unique_id":1, "item_name":"Item1", "price":17}
    },
    {
        "item_unique_id" : 2
        "quantity":4,
        "item_details":{"unique_id":2, "item_name":"Item2", "price":9}
    }
    ]
},
{
    "product_unique_id" : 11,
    "product_detail": {"unique_id":11, "product_name":"Product11", "product_visible":false},
    "items":[
    {
        "item_unique_id" : 1
        "quantity":1,
        "item_details":{"unique_id":1, "item_name":"Item1", "price":17}
    },
    {
        "item_unique_id" : 3
        "quantity":3,
        "item_details":{"unique_id":3, "item_name":"Item3", "price":34}
    },
    {
        "item_unique_id" : 4 
        "quantity":2,
        "item_details":{"unique_id":4, "item_name":"Item4", "price":78}
    }
    ]
}
]

我使用了一些与多个项目相关的查询

var product_query = {
    $lookup:
        {
        from: "products",
        localField: "order_details.product_unique_id",
        foreignField: "unique_id",
        as: "order_details.product_detail"
        }
};


var group_product = {
    $group: {
        _id: '$order_details'
    }
}

var item_query = {
    $lookup:
        {
        from: "items",
        localField: "order_details.items.item_unique_id",
        foreignField: "unique_id",
        as: "order_details.item_details"
        }
};

Order.aggregate([
    {$unwind: "$order_details"},
    {$unwind: "$order_details.items"},
    product_query,
    item_query,
    group_product

], function (error, order) {
    // OUT PUT HERE
});

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合管道。我假设你是3.2版本。

非常标准的东西。对于$unwind + $lookup + $groupitems,您需要products两次,其余的是格式化响应以将所有内容放回原始结构中。

db.orders.aggregate([
    {$unwind: "$order_details"},
    {$unwind: "$order_details.items"},
    {$lookup:{
        from: "items",
        localField: "order_details.items.item_unique_id",
        foreignField: "unique_id",
        as: "order_details.items.item_details"
      }
    },
    {$unwind: "$order_details.items.item_details"},
    { $group: {
        _id: {order_id:'$_id', product_unique_id:"$order_details.product_unique_id"}, 
        "items": {$push:"$order_details.items"}
        }
    },
    {$lookup:{
        from: "products",
        localField: "_id.product_unique_id",
        foreignField: "unique_id",
        as: "_id.product_detail"
      }
    },
    {$unwind: "$_id.product_detail"},
    {$project:{
        "order_detail.product_unique_id":"$_id.product_unique_id",
        "order_detail.product_detail":"$_id.product_detail", 
        "order_detail.items":"$items"  
        }
    },
    {$group: {
        _id: '$_id.order_id', order_details:{$push:"$order_detail"}
        }
    }
])

这个管道可以进一步改进3.4版本。如果您需要3.4版本,我可以添加额外的编辑。