You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:36:04