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
相关产品推荐
相关产品推荐

