标签的猫鼬聚合组项目"/>
按标签的猫鼬聚合组项目
我正在尝试按标签对项目进行分组。但是我没有得到我想要做的。
[具有标签的架构项目(_id
,name
,tags
)是tags_id
的数组(从标签架构中引用)
Item = new Schema({
id: Schema.ObjectId,
name: String,
tags: [ { type: Schema.ObjectId, ref: 'Tag' }]
});
Tag = new Schema({
id: Schema.ObjectId,
name: String
});
这是我到目前为止所做的:
Item.aggregate([
{
"$lookup": {
"from": Tag.collection.name,
"let": { "tags": "$tags" },
"pipeline": [
{
"$match": {
"$expr": { "$in": ['$_id', '$$tags'] }
}
},
{
"$project": {
"_id": 1,
"name": 1
}
}
],
"as": 'tags'
}
},
{
"$group": {
"_id": "$tags._id",
"items": {
"$push": {
"id": "$_id",
"name": "$name",
}
}
}
}
]);
这就是我得到的
{
"data": [
{
"_id": [
"5eb95e8dcae79713f1de0a27"
],
"items": [
{
"id": "5eb95e9fcae79713f1de0a28",
"name": "My Item 1"
}
]
},
{
"_id": [
"5eb9564dc4317411fe79e1bf"
],
"items": [
{
"id": "5eb95b1430f138131ed90f4f",
"name": "My Item 2"
},
{
"id": "5eb95ed0cae79713f1de0a29",
"name": "My Item 3"
}
]
}
]
}
我想获得每个标签的name
,而不仅仅是_id
可能不在数组中。在我希望收到的结果下方:
{
"data": [
{
"_id": "5eb95e8dcae79713f1de0a27",
"name": "My Tag name 1",
"items": [
{
"id": "5eb95e9fcae79713f1de0a28",
"name": "My Item 1"
}
]
},
{
"_id": "5eb9564dc4317411fe79e1bf",
"name": "My Tag name 2",
"items": [
{
"id": "5eb95b1430f138131ed90f4f",
"name": "My Item 2"
},
{
"id": "5eb95ed0cae79713f1de0a29",
"name": "My Item 3"
}
]
}
]
}
我在做什么错?
回答如下:一种解决方法是将name
添加到您的$group
运算符:
...
{
"$group": {
"_id": "$tags._id",
"name": {
"$first": "$name"
},
"items": {
"$push": {
"id": "$_id",
"name": "$name",
}
}
}
}
...
注意,这将获取每个组的第一个匹配条目。另一种选择是使用$replaceRoot
和$mergeObjects
运算符,就像完成here一样。
更多推荐
按标签的猫鼬聚合组项目
发布评论