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
相关产品推荐
相关产品推荐

