如何在MongoDB中获取出现频次最低的字段值并提取版本数字?
MongoDB获取字段频次最低值(含带前缀版本处理)
核心实现思路
通过MongoDB聚合框架,分四步完成:提取纯数字版本号、分组统计频次、按频次升序排序、取频次最低的第一条数据。
完整聚合代码示例
假设目标集合为your_collection,目标字段为version:
db.your_collection.aggregate([ // 1. 提取纯数字版本号,兼容带前缀的情况(如'alpha 1.0.8'提取为'1.0.8') { $addFields: { cleanVersion: { $ifNull: [ { $arrayElemAt: [{ $regexFind: { input: "$version", regex: /\d+(\.\d+)*$/ } }, 0] }, "$version" // 无匹配时保留原字段值 ] } } }, // 2. 按清洗后的版本号分组,统计出现次数 { $group: { _id: "$cleanVersion", count: { $sum: 1 } } }, // 3. 按出现次数升序排序,次数相同时可按版本号排序(可选) { $sort: { count: 1, _id: 1 } }, // 4. 取排序后的第一条,即为频次最低的版本 { $limit: 1 }, // 可选:格式化输出字段,提升可读性 { $project: { _id: 0, leastFrequentVersion: "$_id", occurrenceCount: "$count" } } ])
代码说明
- 提取纯数字版本:使用
$regexFind配合正则/\d+(\.\d+)*$/,匹配字段末尾的数字版本部分(支持1、1.0.8等格式),自动忽略前缀内容。$ifNull用于处理无匹配的异常情况,保留原字段值。 - 分组统计:按清洗后的版本号分组,用
$sum:1累计每个版本的出现次数。 - 排序取最小:按
count升序排序后,$limit:1直接获取频次最低的版本。 - 格式化输出:通过
$project重命名字段,让结果更直观。
示例结果
针对问题中的示例2,执行后会返回:
{ "leastFrequentVersion": "1.0.8", "occurrenceCount": 7 }
内容的提问来源于stack exchange,提问作者WhatTheClown
相关产品推荐
相关产品推荐

