如何在MongoDB中按指定slug条件统计likes数组的元素数量
错误原因
原代码存在3个核心问题:
- 聚合管道要求每个阶段必须以操作符开头,原代码直接将过滤条件作为第一个参数,没有包裹在
$match阶段中,不符合聚合语法要求 - 引用文档字段时需要加
$前缀,原代码中$size:"likes"写法错误,无法正确读取likes字段 - 末尾的
.count()是统计聚合返回的文档数量,不是统计数组的元素个数,完全不符合需求 - 额外兼容问题:如果文档没有
likes字段,$size会直接抛出异常,需要做空值兼容
正确实现
方案1:聚合管道实现
如果必须使用聚合管道,正确写法如下:
db.blog.aggregate([ // 过滤指定slug的文档 { $match: { slug: "slugxyz" } }, // 计算likes数组长度,无此字段默认返回0 { $project: { _id: 0, NumberOfItemsInArray: { $size: { $ifNull: ["$likes", []] } } } } ])
执行后会直接返回包含NumberOfItemsInArray字段的结果,该值就是目标文档的likes数组元素个数。
方案2:更简洁的findOne实现
因为slug是唯一值,不需要使用聚合,直接查询单条文档处理性能更高:
// 只查询需要的likes字段,减少IO开销 const targetDoc = db.blog.findOne({ slug: "slugxyz" }, { likes: 1, _id: 0 }); const likesCount = targetDoc?.likes ? targetDoc.likes.length : 0;
直接打印likesCount即可得到统计结果。
内容的提问来源于stack exchange,提问作者Rijo
相关产品推荐
相关产品推荐

