MongoDB Mongoose如何查询Session模型中含duration字段的文档及计数
解决Mongoose中筛选含duration字段的文档并统计数量的问题
嘿,我明白你的需求——你给Session模型新增了duration属性后,想把所有带有这个字段的文档捞出来,同时统计它们的数量对吧?你之前写的await db.Session.find({}).select({ "duration": 1, "_id": 0})没达到预期,问题出在查询条件没做过滤:空对象{}会匹配所有文档,不管有没有duration字段,select只是控制返回哪些字段,并不会帮你筛掉没有duration的文档。
下面给你两种靠谱的解决方法:
方法1:分开执行查询与统计(直观易懂)
用$exists操作符精准筛选出存在duration字段的文档,再分别获取文档列表和统计数量:
// 获取所有包含duration字段的文档(仅返回duration字段,排除_id) const targetSessions = await db.Session.find( { duration: { $exists: true } }, // 核心:只匹配有duration字段的文档 { duration: 1, _id: 0 } // 控制返回的字段,和你之前的需求一致 ); // 统计这类文档的总数 const totalCount = await db.Session.countDocuments({ duration: { $exists: true } }); console.log(`共找到 ${totalCount} 个包含duration字段的文档:`, targetSessions);
方法2:用聚合管道一次完成(减少数据库请求)
如果想少发一次数据库请求,用聚合管道可以同时拿到文档列表和统计数,效率更高:
const aggregateResult = await db.Session.aggregate([ // 第一步:筛选出存在duration字段的文档 { $match: { duration: { $exists: true } } }, // 第二步:只保留duration字段,排除_id { $project: { duration: 1, _id: 0 } }, // 第三步:用facet同时生成文档列表和统计数 { $facet: { sessionList: [{ $match: {} }], // 存放筛选后的文档 total: [{ $count: 'number' }] // 统计总数 } } ]); // 解析结果 const targetSessions = aggregateResult[0].sessionList; const totalCount = aggregateResult[0].total[0]?.number || 0; console.log(`共找到 ${totalCount} 个包含duration字段的文档:`, targetSessions);
额外补充
如果你的duration字段可能存在但值为null,而你想要的是有实际值的duration(不是仅仅存在字段),可以把查询条件改成:
{ duration: { $exists: true, $ne: null } }
这样就能排除那些字段存在但值为空的文档啦。
内容的提问来源于stack exchange,提问作者margherita pizza
相关产品推荐
相关产品推荐

