2017-08-17 65 views
0

我们可以直接从Perl运行Java脚本来从MongoDB获取数据吗?使用Perl的Mongo DB JavaScript

假设我现在的JS文件是: -

DBQuery.shellBatchSize = 194127180 ; 
permissibleCars = 
["C:93124617:54413209463","C:93124633:54413165206","C:93124634:54413165224"] 

db.getCollection('Test').aggregate([ 
{$match: 
    {   "methods.name": "Download", 
      "methods.status": "ACTIVE",  
      container: {"$in": permissibleCars}, 
      entitlementClass : "Download" 

    } }, 
{"$group" : {_id:"$container", count:{$sum:9}}} 
], 
{ allowDiskUse: true} 
); 

一般来说,当我们运行壳/ bash的,我们运行: -

mongo hostname:portnumber/db_name - user_name -p password <filename.js> output_file.txt 

但我不知道怎么办好呢使用perl。

有人可以帮助我吗?我通过文档阅读没有看到任何东西与Perl的JS。

问候

+1

没有什么能阻止你从Perl中脱壳而出,并运行该命令。你也可以使用https://metacpan.org/pod/JavaScript或其他类型的程序来执行你的东西,但我不会推荐它。您可以使用Mongo API的Perl实现来构建您在JS文件中执行的所有操作。如果你的程序的其余部分是用Perl编写的,你应该可以这么做,而不是一些奇怪的混合体。 – simbabque

+0

所以,同样的JS会工作还是我需要更改JS fornat? – user2854333

+1

请重新阅读我的评论。答案是_yes,它会工作_和_no,你需要重写它。这取决于你如何实现它。答案是_yes_的实现很容易出错,很难并且可能难以维护。但是当你重写它时,你首先需要学习如何做到这一点。从长远来看,一致性应该有更高的价值。 – simbabque

回答

1

使用Perl驱动程序,您可以通过aggregate method来实现。

这将是这个样子:

use strict; 
use warnings; 
use MongoDB; 

my $mc = MongoDB->connect('mongodb://user:[email protected]:port/dbname'); 
my $coll = $mc->ns("dbname.Test"); 

my @permissibleCars = 
    ("C:93124617:54413209463", "C:93124633:54413165206", "C:93124634:54413165224"); 

my @pipeline = (
    { 
     '$match' => { 
      "methods.name"  => "Download", 
      "methods.status" => "ACTIVE", 
      "container"  => { '$in' => \@permissibleCars }, 
      "entitlementClass" => "Download" 

     } 
    }, 
    { '$group' => { _id => '$container', count => { '$sum' => 9 } } } 
); 

my $res = $coll->aggregate(\@pipeline, { allowDiskUse => 1 }); 

然后你得到的结果出来$res迭代器与MongoDB::QueryResult的方法。

要小心不要使用带有$ -prefixed字段的双引号来发送到数据库!

新增验证

use Data::Printer; 
while (my $row = $res->next) {print $row->{'container'}} 
+0

我没有看到任何错误,但结果永远不会打印。更新结果部分 – user2854333

+0

对不起,这是我的错误。我在做语法错误。感谢它是固定的。 – user2854333