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

MongoDB(Mongoose)技术问询:如何统计特定文档数量及购买同一课程的用户总数?

嘿,咱们一步步来解决这两个问题,结合你给出的Mongoose Schema来详细说明:

一、统计MongoDB中特定文档的数量

统计文档数量分两种常见场景,Mongoose都提供了简洁的方法:

  • 统计整个集合的文档总数
    直接使用模型的countDocuments()方法,不需要传条件参数即可获取集合内所有文档的数量:

    // 假设你基于signUpTemplate创建的模型名为User
    const totalUsers = await User.countDocuments();
    console.log(`USERS集合总文档数:${totalUsers}`);
    
  • 统计满足特定条件的文档数量
    如果需要筛选符合条件的文档(比如全名包含特定关键词、购买过课程的用户等),只需要给countDocuments()传入查询条件即可:

    // 统计全名包含"Alice"的用户数(不区分大小写)
    const aliceUsersCount = await User.countDocuments({
      fullname: { $regex: "Alice", $options: "i" }
    });
    
    // 统计至少购买过一门课程的用户数(purchasedCourses数组不为空)
    const paidUsersCount = await User.countDocuments({
      purchasedCourses: { $ne: [] }
    });
    
二、统计购买同一课程的用户总数

由于你的User模型中purchasedCourses是一个数组(每个元素包含课程名称等信息),我们需要用MongoDB的聚合框架来拆分数组并统计去重后的用户数:

下面是针对课程名称为'A'的统计示例:

const targetCourse = 'A';
const purchaseStats = await User.aggregate([
  // 把每个用户的purchasedCourses数组拆分成独立文档
  { $unwind: "$purchasedCourses" },
  // 过滤出购买了目标课程的记录
  { $match: { "purchasedCourses.courseName": targetCourse } },
  // 按用户ID分组,确保同一个用户只被统计一次(避免重复购买的情况)
  { $group: { _id: "$_id" } },
  // 统计分组后的数量,也就是购买该课程的唯一用户数
  { $count: "totalUniqueUsers" }
]);

// 处理聚合结果(如果没有用户购买该课程,返回0)
const totalUsers = purchaseStats.length > 0 ? purchaseStats[0].totalUniqueUsers : 0;
console.log(`购买课程${targetCourse}的用户总数:${totalUsers}`);

如果你的courses集合需要和users集合关联查询(比如通过课程ID匹配),也可以在聚合中加入$lookup阶段,但根据你的Schema设计,purchasedCourses已经存储了课程名称,上面的方法是最直接高效的。

内容的提问来源于stack exchange,提问作者Manas S. Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:12:53