MongoDB $查找对象/文档数组

时间:2019-11-15 21:02:18

标签: mongodb aggregation-framework lookup

我的orders集合的文档架构如下:

{
"_id" : ObjectId("Id of this record"),
    "location_data" : {
        "type" : "main",
        "location_id" : ObjectId("this location's id")
    },
    "item_details" : [
        {
            "item_id" : ObjectId("this item's id"),
            "qty" : 950
        },
        {
            "item_id" : ObjectId("this item's id"),
            "qty" : 200
        }
    ]
}

我将items存储在另一个集合中,该集合的模式如下:

{
    "_id": ObjectId("this record's id"),
    "title": "this item's title",
    "description": "this item's description"
}

我想要的输出是:

{
"_id" : ObjectId("Id of this record"),
    "location_data" : {
        "type" : "main",
        "location_id" : ObjectId("this location's id")
    },
    "item_details" : [
        {
            "title": "this item's title",
            "item_id" : ObjectId("this item's id"),
            "qty" : 950
        },
        {
            "title": "this item's title",
            "item_id" : ObjectId("this item's id"),
            "qty" : 200
        }
    ]
}

在Mongodb文档中,我没有发现任何可用于对象数组的东西。任何帮助都是可观的。

谢谢

1 个答案:

答案 0 :(得分:1)

请尝试以下汇总查询:

db.orders.aggregate([
    {$unwind : "$item_details"},  // Since the item_details is an array, unwind it first
    {$lookup:     // run the $lookup to join with `items` collections
        {
            from: "items", 
            localField: "item_details.item_id",
            foreignField: "_id",
            as: "item_detailsTemp"
        }
    },
    { 
        $addFields: { "item_details" : { $mergeObjects: [ { $arrayElemAt: [ "$item_detailsTemp", 0 ] }, "$item_details" ] } } // Replace the existing item_details with new information 
    },
    {
        $group : { // Since you've ran the $unwind at early stage, group it to make the item_details as an array again
           "_id" : "$_id", 
           "location_data" : {$first : "$location_data"}, 
           "item_details" : {$push : "$item_details"}}
    }
])
// Voila! Hope this helps!