как вызвать функцию на стороне сервера mongodb внутри mapReduce в java - PullRequest
0 голосов
/ 26 марта 2020

Я сохранил две функции в коллекции "system. js" с именами "mapfun" и "redufun", и я пытаюсь вызвать эти функции из java. я пытаюсь вызвать эти функции через MapReduceCommand. я не могу вызвать эти функции. Может кто-нибудь, пожалуйста, помогите мне с этим. две функции выглядят следующим образом // mapfun

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

// redufun

{ "_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; }" } }

и моя команда mapreduce выглядит следующим образом

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

я прошел карту и уменьшить функцию как строки, в которой я вызвал mapfun и redufun соответственно, и это выглядит так

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

что я делаю не так и как это исправить, любезно помогите мне в этом.

1 Ответ

0 голосов
/ 26 марта 2020

Основная проблема заключается в том, что переменная this переназначается для каждого вызова функции.

Для демонстрации я выполнил короткий тест из оболочки mon go.

Создаю коллекцию, содержащую 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
        }
    ],
...

As Вы можете видеть, что this.canary был неопределен, но arg.canary содержал значение из входного документа.

Каркас mapReduce назначает this документу, который в данный момент проверяется при вызове функции карты. Когда хранимая функция вызывается из функции карты, она получает свою собственную this. Однако, вызывая функцию как testfun(this), исходный this контекст функции карты предоставляется хранимой функции в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...