2017-08-17 61 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