MongoDB索引创建及按MMSI分组的船舶位置查询需求
嘿,这需求用MongoDB的聚合框架就能完美解决!我给你写个完整的查询示例,再一步步拆解每个部分的作用:
完整聚合查询代码
db.yourCollectionName.aggregate([ // 核心:按MMSI分组,统计总数并收集坐标 { $group: { _id: "$properties.MMSI", // 以MMSI作为分组依据 totalRecords: { $sum: 1 }, // 统计该MMSI对应的总记录数 coordinates: { $push: "$geometry.coordinates" } // 收集所有对应的坐标数组 } }, // 可选:对结果排序(比如按总记录数降序) { $sort: { totalRecords: -1 } }, // 可选:优化输出格式(把分组用的_id重命名为MMSI) { $project: { MMSI: "$_id", totalRecords: 1, coordinates: 1, _id: 0 // 隐藏原始的_id字段,让结果更直观 } } ])
各阶段详细说明
$group阶段:这是实现需求的核心。$sum:1会给每组的每条记录累加1,最终得到该MMSI的总记录数;$push则会把每个文档里的geometry.coordinates数组,逐一收集到一个新的数组中,方便后续查看该船舶的所有位置点。$sort阶段:可选步骤,如果你需要对结果排序,比如想先看记录数最多的船舶,就用{ totalRecords: -1 }(降序);如果想按MMSI编号升序排列,就改成{ MMSI: 1 }。$project阶段:可选步骤,用来调整输出的字段名称,把分组用的_id重命名为MMSI,同时隐藏原始的_id字段,让最终结果的可读性更强。
示例输出效果
运行查询后,你会得到类似这样的结构化结果:
[ { "MMSI": "636015036", "totalRecords": 5, "coordinates": [ [157.0625, -24.36573], [157.1234, -24.45678], // 该MMSI对应的其他坐标... ] }, // 其他MMSI的分组结果... ]
内容的提问来源于stack exchange,提问作者e7lT2P
相关产品推荐
相关产品推荐

