mongodb聚合和分组嵌套对象

时间:2016-11-01 20:55:07

标签: mongodb

我有几个系列:

User {
 items: [ObjectID(n)]
}

Items {
 _id: ObjectID(n),
 name: '',
 categories: [ObjectID(n)]
}

Categories {
 _id: ObjectID(n),
 name: ''
}

我使用下面的查询来查找项目:

db.Users.aggregate(
    [
        {
            $match: {
                _id: ObjectId("n")
            }
        }, {
            $unwind: "$items"
        }, {
            $lookup: {
                from: "Items",
                localField: "items",
                foreignField: "_id",
                as: "items"
            }
        }, {
            $unwind: "$items"
        }, {
            $group: {
                _id: "$_id",
                items: { $push: "$items" }
            }
        }
    ]
)

现在我填充 Users.items ,但我无法处理项目内的类别。我使用下面的代码来获取类别。

db.Users.aggregate(
    [
        {
            $match: {
                _id: ObjectId("n")
            }
        }, {
            $unwind: "$items"
        }, {
            $lookup: {
                from: "Items",
                localField: "items",
                foreignField: "_id",
                as: "items"
            }
        }, {
            $unwind: "$items"
        }, {
            $unwind: "$items.categories"
        }, {
            $lookup: {
                from: "Categories",
                localField: "items.categories",
                foreignField: "_id",
                as: "items.categories"
            }
        }, {
            $group: {
                _id: "$_id",
                items: { $push: "$items" }
            }
        }
    ]
)

但我无法执行正确的分组。

如何正确地将项目内的类别分组?

1 个答案:

答案 0 :(得分:1)

我认为你到目前为止已走上正轨。现在你只需要进行嵌套分组来合并结构。所以你最后需要两个组。首先按用户ID和项目ID分组,然后按用户ID推送唯一用户项目以及类别和最终分组,并将项目与其类别一起推送。

db.User.aggregate(
    [{
        $match: {
            _id: 123
        }
    }, {
        $unwind: "$items"
    }, {
        $lookup: {
            from: "Items",
            localField: "items",
            foreignField: "_id",
            as: "userItems"
        }
    }, {
        $unwind: "$userItems"
    }, {
        $unwind: "$userItems.categories"
    }, {
        $lookup: {
            from: "Categories",
            localField: "userItems.categories",
            foreignField: "_id",
            as: "categoryItems"
        }
    }, {
        $group: {
            _id: {
                id: "$_id",
                itemId: "$userItems._id"
            },
            items: {
                $addToSet: "$items"
            },
            categories: {
                $push: "$categoryItems"
            }
        }
    }, {
        $group: {
            _id: "$_id.id",
            itemCategories: {
                $push: {
                    items: "$items",
                    categories: "$categories"
                }
            }
        }
    }]
);

示例输出:

{
    "_id": 123,
    "itemCategories": [{
        "items": [456],
        "categories": [
            [{
                "_id": 789
            }],
            [{
                "_id": 890
            }]
        ]
    }, {
        "items": [234],
        "categories": [
            [{
                "_id": 567
            }],
            [{
                "_id": 678
            }]
        ]
    }]
}