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"] } } } ])
代码解释
- $project阶段:用
$split把time字段按空格分割成“日期”和“时间”两部分,再用$first取出日期部分存到新字段date里,同时保留原文档的name、place、time字段。 - $group阶段:以
date作为分组键(_id),用$push把每个分组里的文档(只保留你需要的字段)收集到docs数组中。 - $project阶段:把分组后的
_id(日期)和docs数组转换成{k: 日期, v: 文档数组}的键值对结构,方便后续转换。 - $replaceRoot阶段:用
$arrayToObject把键值对转换成你想要的对象格式,然后替换掉根文档,最终输出就是你要的结果。
额外提示
如果你的time字段以后改成了MongoDB的Date类型(更推荐的做法),那提取日期的方式会不一样,比如用$dateToString来格式化日期,但就你当前的字符串格式来说,上面的代码完全适用。
内容的提问来源于stack exchange,提问作者sinrakshian
相关产品推荐
相关产品推荐

