MongoDB分类内容统计查询优化:仅返回分类信息与计数
修正MongoDB聚合查询以返回分类统计及精简内容列表
我来帮你调整这个聚合查询,让它返回你想要的结果——分类完整信息、对应内容的计数,以及仅包含内容_id的精简列表。
修正后的聚合查询
db.categories.aggregate([ // 保留原有的过滤条件:筛选有parentId的分类 {$match:{"parentId":{$ne : null}}}, // 使用带内部管道的lookup,仅拉取contents的_id字段 { $lookup: { from: "contents", let: { categoryId: "$_id" }, pipeline: [ { $match: { $expr: { $in: ["$$categoryId", "$categories._id"] } } }, { $project: { _id: 1 } } // 只投影_id,精简返回内容 ], as: "_content" } }, // 添加contentCount字段,计算对应内容的数量 { $addFields: { contentCount: { $size: "$_content" } } } ])
关键改动说明
- 替换普通lookup为带内部pipeline的版本:原查询的
lookup会直接拉取完整的contents文档,通过内部$match和$project,我们只获取每个内容的_id,让_content数组更精简。 - 新增contentCount字段:利用
$size函数统计_content数组的长度,直接得到该分类下的内容总数,不需要额外分组计算。 - 移除多余的$group和$replaceRoot阶段:原查询的这两个步骤是不必要的,因为
lookup执行后每个分类已经是独立的文档,不需要再分组合并。
执行后返回的结果示例
{ "_id" : ObjectId("5a6b98864f1408137f79e507"), "orderId" : 1, "parentId" : ObjectId("5a6b8fbd4f1408137f79e3b3"), "title_en" : "Foreign Movie", "contentTypes" : 1, "isEnabled" : true, "state" : 0, "expired" : Timestamp(1516998589, 1), "created" : Timestamp(1516998589, 2), "updated" : Timestamp(1516998589, 3), "contentCount": 1, "_content" : [ { "_id" : ObjectId("5a6b8b734f1408137f79e2cc") } ] }
内容的提问来源于stack exchange,提问作者Ehsan Farahani Asil
相关产品推荐
相关产品推荐

