在$ group和$ lookup之后,MongoDB重新格式化/展平文档

时间:2017-02-07 09:31:45

标签: mongodb aggregation-framework document reduce

我有一些数据,产品,它们具有属性值和该属性的id。 属性的标签位于同一个集合中,但使用type: "attribute"而不是`type:“product”。我需要加入这些,所以我有产品,包括属性的标签和它们的价值。

我有非常简单的示例数据她:https://gist.github.com/flowl/632243bca8f2907a672f66920ea0f793

我的聚合看起来像这样:

db.input.aggregate([
    {
        $unwind: "$attributes"
    },
    {
        $lookup: {
            from: "input",
            localField: "attributes.id",
            foreignField: "attributeId",
            as: "attributeLabels"
        }
    },
    {
        $match: { "output": { $ne: [] } }
    },
    {
        $group: {
            _id: "$productId",
            product: { "$first": "$$CURRENT"}
        }
    },
    { $group : { _id : "$product._id", data: { $push: "$$ROOT" } } }
]);

问题是,我想重新格式化输出:

{
    "_id" : ObjectId("5899925339db9185f13432c4"),
    "data" : [
        {
            "_id" : 111,
            "product" : {
                "_id" : ObjectId("5899925339db9185f13432c4"),
                "type" : "product",
                "productId" : 111,
                "attributes" : {
                    "id" : 1,
                    "value" : "L"
                },
                "attributeLabels" : [
                    {
                        "_id" : ObjectId("5899927539db9185f13432cb"),
                        "type" : "attribute",
                        "attributeId" : 1,
                        "label" : "Size"
                    }
                ]
            }
        }
    ]
}

对此:

{
    "_id" : ObjectId("5899925339db9185f13432c4"),
    "type" : "product",
    "productId" : 111,
    "attributes" : [
        {
            "_id" : ObjectId("5899927539db9185f13432cb"),
            "type" : "attribute",
            "attributeId" : 1,
            "label" : "Size",
            "value" : "L"
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

您可以使用以下聚合。

这会将SqlDataSourceEnumerator数组中的id字段值替换为attributes值。

响应不完全相似,但它包含$lookUp的所有属性值。

product

样本回复

db.input.aggregate([{
    $unwind: "$attributes"
}, {
    $lookup: {
        from: "input",
        localField: "attributes.id",
        foreignField: "attributeId",
        as: "attributes.id"
    }
}, {
    $match: {
        "attributes.id": {
            $ne: []
        }
    }
}, {
    $unwind: "$attributes.id"
}, {
    $group: {
        _id: "$_id",
        type: {
            "$first": "$type"
        },
        productId: {
            "$first": "$productId"
        },
        attributes: {
            "$push": "$attributes"
        }
    }
}]);