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

MongoDB按日期分组查询求助:生成指定格式输出

解决MongoDB按日期字符串分组并重塑结果的问题

嘿,别担心,这事儿不难搞定!针对你要按日期分组并输出指定格式结果的需求,我们可以用MongoDB的聚合管道来实现,下面一步步给你讲清楚:

核心思路

我们需要先从time字段里提取出日期部分,然后按这个日期分组收集对应的文档,最后把分组结果转换成你想要的“日期作为键、文档数组作为值”的对象格式。

完整聚合查询代码

直接上能跑的代码,你可以把db.collection换成你实际的集合名称:

db.collection.aggregate([
  // 第一步:从time字段中提取日期字符串(按空格分割取第一部分)
  {
    $project: {
      name: 1,
      place: 1,
      time: 1,
      date: { $first: { $split: ["$time", " "] } }
    }
  },
  // 第二步:按提取出的日期分组,把同日期的文档收集到数组里
  {
    $group: {
      _id: "$date",
      docs: { $push: { name: "$name", place: "$place", time: "$time" } }
    }
  },
  // 第三步:把分组结果转换成键值对结构,为后续转对象做准备
  {
    $project: {
      _id: 0,
      keyValuePair: { k: "$_id", v: "$docs" }
    }
  },
  // 第四步:将键值对转换成目标格式的对象,并作为根文档输出
  {
    $replaceRoot: { newRoot: { $arrayToObject: ["$keyValuePair"] } }
  }
])

代码解释

  1. $project阶段:用$split把time字段按空格分割成“日期”和“时间”两部分,再用$first取出日期部分存到新字段date里,同时保留原文档的name、place、time字段。
  2. $group阶段:以date作为分组键(_id),用$push把每个分组里的文档(只保留你需要的字段)收集到docs数组中。
  3. $project阶段:把分组后的_id(日期)和docs数组转换成{k: 日期, v: 文档数组}的键值对结构,方便后续转换。
  4. $replaceRoot阶段:用$arrayToObject把键值对转换成你想要的对象格式,然后替换掉根文档,最终输出就是你要的结果。

额外提示

如果你的time字段以后改成了MongoDB的Date类型(更推荐的做法),那提取日期的方式会不一样,比如用$dateToString来格式化日期,但就你当前的字符串格式来说,上面的代码完全适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:57:30