MongoDB多字段分组统计:统计content.A/C值频次并取Top5(PHP示例)
PHP MongoDB 查询示例:统计content.A与content.C字段值的出现次数并取Top5
要实现你需要的统计需求,我们可以利用MongoDB的聚合框架来完成,下面是完整的PHP代码示例,我会一步步拆解逻辑:
核心思路
- 使用
$project阶段把content.A和content.C合并成一个统一的数组,过滤掉不存在的字段值 - 使用
$unwind展开这个数组,让每个值单独成为一条文档 - 使用
$group按值分组,统计每个值的出现次数 - 使用
$sort按次数倒序排列结果 - 使用
$limit筛选出Top5的统计结果
完整代码示例
<?php // 连接MongoDB服务 $client = new MongoDB\Client("mongodb://localhost:27017"); // 替换成你的数据库名和集合名 $collection = $client->your_database_name->your_collection_name; // 构建聚合查询管道 $pipeline = [ // 第一步:整合A和C字段的值,过滤掉null(即字段不存在的情况) [ '$project' => [ 'values' => [ '$filter' => [ 'input' => [['val' => '$content.A'], ['val' => '$content.C']], 'cond' => ['$ne' => ['$$this.val', null]] ] ] ] ], // 第二步:展开数组,每个值单独成文档 ['$unwind' => '$values'], // 第三步:按值分组统计次数 [ '$group' => [ '_id' => '$values.val', 'count' => ['$sum' => 1] ] ], // 第四步:按次数倒序排序 ['$sort' => ['count' => -1]], // 第五步:取Top5结果 ['$limit' => 5] ]; // 执行聚合查询 $results = $collection->aggregate($pipeline); // 遍历输出结果 foreach ($results as $item) { echo "{$item->_id}: {$item->count}" . PHP_EOL; } ?>
代码细节说明
$filter的作用是排除字段不存在的情况,避免把null值统计进去$unwind是聚合中常用的操作,能把数组拆分成独立文档,确保每个值都能被单独计数- 你可以根据实际需求调整输出格式,比如把结果转成JSON格式或者存入数组中
运行这段代码后,就能得到你期望的统计结果:a:2、c:1(如果有其他值,会按出现次数从高到低取前5)
内容的提问来源于stack exchange,提问作者Lamyee
相关产品推荐
相关产品推荐

