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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:24:04