如何使用PHP在MongoDB上执行JS代码

时间:2014-10-11 11:41:12

标签: php mongodb

如何使用PHP在MongoDB上执行一小段JS代码,最好使用laravel-mongodb驱动程序,但这不是一个很难的要求。

var size = 0;
db.mycollection.find( { project_id: 151 } ).forEach(function(obj) {
    var curr = Object.bsonsize(obj); 
    size = size + curr;
})
print(size);

如果需要将其转换为存储函数并不重要,只要它能够在共享的MongoDB上运行并且项目ID(在这种情况下为151)不是固定的。如果有人知道一个更好的功能或解决方案对我也没关系,只要我可以计算给定project_id的所有对象的大小。

对此事有何疑问?

1 个答案:

答案 0 :(得分:0)

如果您使用的PHP-PECL-mongodb> = 1.0.0和mongoDB <= 4.0版本,您仍然可以使用eval command

从mongoDB 3.0开始不推荐使用,我不知道将来的版本是否允许替代。

MongoDB\Driver\Manager::executeCommand() method将帮助您执行eval命令。

以您的示例为例:

$jscode = new \MongoDB\BSON\Javascript(<<<'NOWDOC'
var size = 0;
db.mycollection.find( { project_id: 151 } ).forEach(function(obj) {
    var curr = Object.bsonsize(obj); 
    size = size + curr;
})
return size;
NOWDOC
);

请注意,print函数在求值过程中不会写入任何输出,我改用return返回值。

执行可能是:

$manager = new \MongoDB\Driver\Manager($uri, $uriOptions, $driverOptions);
$result = $manager->executeCommand('dbname', new \MongoDB\Driver\Command(['eval' => $jscode]))->toArray();

var_dump($result[0]["retval"]); // returned size (int)
var_dump($result[0]['ok']); // 1 (double)

注意:要执行JS,您必须具有良好的权限(管理员角色)