如何在Mongoose中统计Chat集合里未标记为seen的消息数量
如何统计聊天服务器中未标记为seen的消息数量?
我正在构建一个聊天服务器,需要获取未标记为seen的消息数量。以下是我的Schema:
const ChatSchema = mongoose.Schema({ chatId: { type: String, required: true, unique: true }, messages: [ { message: { type: String, required: true }, sendBy: { type: String, required: true }, sendTo: { type: String, required: true }, seen: { type: Boolean, default: false }, date: { type: Date, default: Date.now()} }, ], })
我尝试了以下代码,但它总是返回1:
const unSeenCount=await Chat.find({ chatId: chatId }, { messages : { $elemMatch : { seen : false } } }) console.log(`unseen count is ${unSeenCount.length}`);
问题原因
你的代码返回1是因为find()方法返回的是匹配chatId的Chat文档对象,哪怕该文档里有多个未读消息,返回的数组长度始终是1(因为每个chatId是唯一的),而不是未读消息的数量。
正确解决方案
方法一:使用MongoDB聚合框架(推荐,数据库层面计算)
通过聚合管道过滤未读消息并统计数量,适合大数据量场景,减少客户端与数据库之间的数据传输:
const unSeenCountResult = await Chat.aggregate([ // 匹配目标聊天文档 { $match: { chatId: chatId } }, // 投影计算未读消息数量 { $project: { unseenCount: { $size: { $filter: { input: "$messages", // 遍历messages数组 cond: { $eq: ["$$this.seen", false] } // 筛选seen为false的消息 } } } } } ]); // 处理结果:如果找到文档则取unseenCount,否则为0 const unSeenCount = unSeenCountResult.length > 0 ? unSeenCountResult[0].unseenCount : 0; console.log(`unseen count is ${unSeenCount}`);
方法二:查询文档后手动统计(代码更直观,适合小数据量)
先获取完整的Chat文档,再在客户端过滤未读消息并统计:
const chatDoc = await Chat.findOne({ chatId: chatId }); // 若文档存在则过滤统计,否则为0 const unSeenCount = chatDoc ? chatDoc.messages.filter(msg => !msg.seen).length : 0; console.log(`unseen count is ${unSeenCount}`);
内容的提问来源于stack exchange,提问作者Muhammed Jasir
相关产品推荐
相关产品推荐

