You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
}
?>

代码说明

  1. 替换your_database和your_collection为你实际的数据库名和集合名
  2. 聚合管道执行后,会直接返回你期望的分组求和结果,每个文档包含_id(原键名)和total(求和值)
  3. 如果你的MongoDB连接需要认证,可在MongoDB\Client的构造参数中添加用户名和密码,例如:mongodb://username:password@localhost:27017

内容的提问来源于stack exchange,提问作者Marlon code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:50:29