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

MongoDB Node.js聚合代码转PHP后无结果,请求技术协助

Node.js MongoDB聚合查询转PHP后无结果解决方法

我的Node.js版本MongoDB聚合查询能正常运行,但转写成PHP版本后无法返回任何结果,相关代码如下:

可正常运行的Node.js代码

db.mevcutlot.aggregate([
  {$match: {_id: {$ne: null}}}, 
  { $sort: { ederi: -1 } },
  { $group: { _id: '$firmasaf', data: { $push: '$$ROOT' } } },
  { $project: { _id: 0, data: { $arrayElemAt: ["$data", 0] } } },
  { $replaceRoot: { newRoot: "$data" } }
])

无返回结果的PHP代码

$pipeline=array(
    array(
        '$match' => array(
            '_id' => ['$ne'=>NULL],
         )
    ),
    array(
        '$sort' => array(
             'ederi'=>  -1,
         )
    ),
    array(
        '$group' => array(
             '_id' => '$firmasaf', 'data'=> ['$push'=> '$$ROOT'],            
         )
    ),
    
    array(
        '$project' => array(
        '_id' => 0, 
        'data' => ['$arrayElemAt'=> ["$data", 0]],
         )
    ),
     array(
        '$replaceRoot' => array(
             'newRoot'=> "$data",        
         )
    ),
    
); 
$mana = $mevcutlot->aggregate($pipeline)->toArray();
print_r($mana);

问题排查与修正

PHP代码的核心问题是双引号解析变量导致MongoDB字段引用错误:

  • 在$project阶段的$arrayElemAt中,["$data", 0]使用了双引号,PHP会把$data当作本地变量解析(而该变量未定义,最终传递给MongoDB的是空字符串),应该改成单引号包裹的'$data'。
  • 同理,$replaceRoot阶段的"$data"也要改成'$data',避免PHP解析变量。

修正后的PHP代码:

$pipeline=array(
    array(
        '$match' => array(
            '_id' => ['$ne'=>NULL],
         )
    ),
    array(
        '$sort' => array(
             'ederi'=>  -1,
         )
    ),
    array(
        '$group' => array(
             '_id' => '$firmasaf', 'data'=> ['$push'=> '$$ROOT'],            
         )
    ),
    
    array(
        '$project' => array(
            '_id' => 0, 
            'data' => ['$arrayElemAt'=> ['$data', 0]],
         )
    ),
    array(
        '$replaceRoot' => array(
             'newRoot'=> '$data',        
         )
    ),
    
); 
$mana = $mevcutlot->aggregate($pipeline)->toArray();
print_r($mana);

额外说明:$match阶段的_id: {$ne: null}可以根据实际数据情况决定是否保留,因为MongoDB默认的_id字段不会为null,只有手动插入过_id为null的文档时才需要这个条件。

内容的提问来源于stack exchange,提问作者Yusuf Damista

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:22:03