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

如何在PyMongo中按月份查询所有id字段

查询MongoDB中同一月份创建的所有id字段

你遇到的问题很常见——精确匹配timestamp只能找到单个文档,而我们需要匹配整个月份的范围或者提取月份维度来筛选。下面给你两种实用的解决方案,适配不同的场景:

方法1:日期范围精准匹配

这是最直接高效的方式,通过构造目标月份的起始和结束时间,用范围操作符$gte(大于等于)和$lte(小于等于)来筛选文档,同时指定只返回id字段:

// 定义目标月份的起始和结束UTC时间(这里以2020年3月为例)
const targetMonthStart = new Date('2020-03-01T00:00:00.000+00:00');
const targetMonthEnd = new Date('2020-03-31T23:59:59.999+00:00');

// 执行查询,仅返回id字段(排除默认的_id)
db.collection.find(
  { timestamp: { $gte: targetMonthStart, $lte: targetMonthEnd } },
  { id: 1, _id: 0 }
)

这种方法的优势是性能最优,如果你的timestamp字段有索引(建议创建,下文会提),查询速度会非常快,适合大数据集场景。

方法2:使用聚合管道提取月份维度

如果需要动态处理月份(比如不需要手动构造日期范围,或者要按月份分组统计id列表),可以用MongoDB的聚合管道,通过$year和$month操作符提取时间维度后筛选:

场景1:筛选指定年月的id

db.collection.aggregate([
  // 从timestamp中提取年份和月份字段
  {
    $addFields: {
      docYear: { $year: "$timestamp" },
      docMonth: { $month: "$timestamp" }
    }
  },
  // 匹配2020年3月的文档
  {
    $match: {
      docYear: 2020,
      docMonth: 3
    }
  },
  // 仅保留id字段
  {
    $project: {
      id: 1,
      _id: 0
    }
  }
])

场景2:按年月分组,获取每个月的id列表

如果需要一次性获取所有月份对应的id集合,可以在聚合中加入$group阶段:

db.collection.aggregate([
  {
    $addFields: {
      docYear: { $year: "$timestamp" },
      docMonth: { $month: "$timestamp" }
    }
  },
  // 按年月分组,收集每组的id
  {
    $group: {
      _id: { year: "$docYear", month: "$docMonth" },
      monthIds: { $push: "$id" }
    }
  }
])

性能优化建议

对于大型数据集,一定要给timestamp字段创建单字段索引,能大幅提升查询速度:

db.collection.createIndex({ timestamp: 1 })

内容的提问来源于stack exchange,提问作者pandarulez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:37:30