MongoDB统计readBy数组不含指定userId的未读Offer数量方法
统计指定用户的未读Offer数量
要统计用户5add82620d7f5b38240c63d4的未读Offer数量,核心就是找出该用户ID不在readBy数组中的Offer文档(包括那些还没有被任何用户读过、压根没有readBy字段的Offer)。这里给你两种实用的实现方式:
方法一:用countDocuments快速统计
这是最直接的方式,一行代码就能得到结果:
db.offers.countDocuments({ readBy: { $nin: [ObjectId("5add82620d7f5b38240c63d4")] } })
为什么这么写?
$nin操作符会自动匹配两种符合条件的文档:- 没有
readBy字段的Offer(完全未被阅读) readBy数组里不包含目标用户ID的Offer(其他用户读过,但该用户没读)
- 没有
- 一定要把字符串ID转换成
ObjectId,因为集合里存储的readBy元素是ObjectId类型,直接用字符串匹配会出错。
方法二:用聚合管道(适合扩展统计)
如果之后你需要同时做其他统计(比如按过期时间分组统计未读数量),用聚合管道会更灵活:
db.offers.aggregate([ // 第一步:筛选出该用户未读的Offer { $match: { readBy: { $nin: [ObjectId("5add82620d7f5b38240c63d4")] } } }, // 第二步:统计数量并返回结果 { $count: "unreadOffersCount" } ])
执行后会返回类似{ "unreadOffersCount": 3 }的结果,清晰直观。
内容的提问来源于stack exchange,提问作者Ashish Choudhary
相关产品推荐
相关产品推荐

