我有两个不同的模型:
每个促销都有一个引用标签ID的字段。这在我的模式中被引用了,并且运行良好:
const PromotionSchema = mongoose.Schema({
tags: { type: mongoose.Schema.Types.ObjectId, ref: 'Tag' }
}, { collection: 'promotions' });
我的问题是如何创建一个自定义响应,按标签对所有促销进行分组?如下所示:
{
"tag": {
"_id": "999",
"value": "Lorem Ipsum"
},
"promotions": [{
"_id": "0001",
"value": "Value of promotion Nº1"
},
{
"_id": "0002",
"value": "Value of promotion Nº2"
},
... And the others that have the same Tag ID assigned
]}
}
现在,我正在使用Vanilla Javascript获得所有的促销和过滤。我需要知道如何使用Mongoose来改善这一点。
发布于 2018-06-04 02:21:20
你可以尝试下面的聚合函数来实现结果...
如果您有mongodb版本3.6
db.promotion.aggregate([
// stage 1
{ "$lookup": {
"from": Promotions.collection.name,
"let": { "tags": "$tags" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$_id", "$$tags" ] } } }
],
"as": "tags"
}},
// stage 2
{ "$addFields": {
"tags": { "$arrayElemAt": [ "$tags", 0 ] }
}},
// stage 3
{ "$group": {
"_id": "$tags._id",
"promotions": {
"$push": {
"fieldName1": "$fieldName1",
"fieldName2": "$fieldName2",
}
}
}}
])
如果您的mongodb版本早于3.6
db.promotion.aggregate([
{ "$lookup": {
"from": Promotions.collection.name,
"localField": "tags",
"foreignField": "_id"
"as": "tags"
}},
{ "$unwind": "tags" },
{ "$group": {
"_id": "$tags._id",
"promotions": {
"$push": {
"fieldName1": "$fieldName1",
"fieldName2": "$fieldName2",
}
}
}}
])
两者都会产生类似的输出
{
"tag": {
"_id": "999",
"value": "Lorem Ipsum"
},
"promotions": [{
"_id": "0001",
"value": "Value of promotion Nº1"
},
{
"_id": "0002",
"value": "Value of promotion Nº2"
}
]}
}
https://stackoverflow.com/questions/50669287
复制相似问题