簡體   English   中英

如何在java中的mapReduce中調用mongodb服務器端函數

[英]how to call mongodb server side function inside mapReduce in java

我在名為“mapfun”和“reducefun”的“system.js”集合中存儲了兩個函數,我試圖從java調用這些函數。 我正在嘗試通過 MapReduceCommand 調用這些函數。 我無法調用這些函數。 任何人都可以幫我解決這個問題。 這兩個函數看起來像這樣 //mapfun

{ "_id" : "mapfun","value" : { "code" : "function(){var criteria; if(this.speed > 70 ){ criteria="overspeed";emit(criteria,this.speed); } }" } }

//減少樂趣

{ "_id" : "reducefun", "value" : { "code" : "function(key,speed){ var total=0; for(var i=0;i<speed.length;i++){ total=total+speed[i]; } return total/speed.length; }" } }

我的 mapreducecommand 看起來像這樣

MapReduceCommand command=new MapReduceCommand(collection, map, reduce, null, MapReduceCommand.OutputType.INLINE, null);
MapReduceOutput output=collection.mapReduce(command);

我已經將 map 和 reduce 函數作為字符串傳遞,其中我分別調用了 mapfun 和 reducefun,它看起來像這樣

String map = "function (){var x=mapfun();"
                + "return x;};";
String reduce = "function(key, speed) {var y=reducefun(key,speed);"
                + "return y;};";

我在這里做錯了什么以及如何糾正這個問題請幫助我解決這個問題。

潛在的問題是為每個函數調用重新分配了this變量。

為了演示,我從 mongo shell 運行了一個簡短的測試。

拳頭創建一個包含 1 個文檔的集合:

MongoDB Enterprise replset:PRIMARY> db.maptest.find({},{_id:0})
{ "canary" : "tweet" }

然后創建一個存儲函數,該函數將接受一個參數發出 2 個值,一個使用this ,一個使用傳遞的參數:

MongoDB Enterprise replset:PRIMARY> db.system.js.find()
{ "_id" : "testfun", "value" : { "code" : "function(arg){emit(\"this.canary\",this.canary),emit(\"arg.canary\",arg.canary)}" } }

然后在 mapReduce 調用中使用存儲的函數:

MongoDB Enterprise replset:PRIMARY> db.maptest.mapReduce(function(){testfun(this)},function(a,b){return {a:a,b:b}},{out:{inline:1}})
{
    "results" : [
        {
            "_id" : "arg.canary",
            "value" : "tweet"
        },
        {
            "_id" : "this.canary",
            "value" : undefined
        }
    ],
...

如您所見, this.canary未定義,但arg.canary包含來自輸​​入文檔的值。

MapReduce框架受讓人this調用地圖功能時,目前正在審查的文件。 當從 map 函數內部調用存儲的函數時,它會獲得自己的this 但是,通過將函數作為testfun(this)調用,映射函數的原始this上下文作為參數提供給存儲的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM