我有几个系列:
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" }
}
}
]
)
但我无法执行正确的分组。
如何正确地将项目内的类别分组?
答案 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
}]
]
}]
}