如何使用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的所有对象的大小。
对此事有何疑问?
答案 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,您必须具有良好的权限(管理员角色)