如何在PHP中对MongoDB对象数据按键名分组并求和对应值?
PHP实现MongoDB按嵌套对象键分组求和
要实现你需要的按value对象的键分组并求和的需求,核心是利用MongoDB的聚合管道处理嵌套对象的解构与分组计算,以下是具体的PHP实现方案:
聚合管道逻辑说明
需要通过以下几个聚合阶段完成转换:
- $objectToArray:将
value字段的对象结构转为键值对数组(格式如[{k: "键名", v: 数值}]),方便后续遍历处理 - $unwind:展开上一步得到的数组,让每个键值对成为独立的文档
- $group:按键名(
k字段)分组,对对应的数值(v字段)求和 - $project:将分组后的
k重命名为_id,匹配你期望的输出格式
PHP代码实现
<?php // 连接MongoDB $client = new MongoDB\Client("mongodb://localhost:27017"); // 指定数据库和集合 $collection = $client->your_database->your_collection; // 定义聚合管道 $pipeline = [ // 将value对象转为键值对数组 ['$project' => [ 'kvPairs' => ['$objectToArray' => '$value'] ]], // 展开数组,每个键值对单独成文档 ['$unwind' => '$kvPairs'], // 按键名分组求和 ['$group' => [ '_id' => '$kvPairs.k', 'total' => ['$sum' => '$kvPairs.v'] ]], // 调整字段顺序,匹配期望结果格式 ['$project' => [ '_id' => 1, 'total' => 1 ]] ]; // 执行聚合查询 $result = $collection->aggregate($pipeline); // 输出结果 foreach ($result as $doc) { print_r($doc); } ?>
代码说明
- 替换
your_database和your_collection为你实际的数据库名和集合名 - 聚合管道执行后,会直接返回你期望的分组求和结果,每个文档包含
_id(原键名)和total(求和值) - 如果你的MongoDB连接需要认证,可在
MongoDB\Client的构造参数中添加用户名和密码,例如:mongodb://username:password@localhost:27017
内容的提问来源于stack exchange,提问作者Marlon code
相关产品推荐
相关产品推荐

