Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ReferenceError:未定义db";_Java_Javascript_Mongodb - Fatal编程技术网

Java ReferenceError:未定义db";

Java ReferenceError:未定义db";,java,javascript,mongodb,Java,Javascript,Mongodb,我尝试使用以下代码从Java运行一些Js代码: public void mapReduceScript() { try{ MongoClient mongoClient = new MongoClient( CoreConfigModel.get("com.dice.api.mongo.host") , Integer.parseInt(CoreConfigModel.get("com.dice.api.mongo.port"))); //

我尝试使用以下代码从Java运行一些Js代码:

public void mapReduceScript()
    {
        try{
        MongoClient mongoClient = new MongoClient( CoreConfigModel.get("com.dice.api.mongo.host") , Integer.parseInt(CoreConfigModel.get("com.dice.api.mongo.port")));
        // Now connect to your databases
        DB db = mongoClient.getDB( "tracking" );
         System.out.println("Connect to database successfully");
        boolean auth = db.authenticate(CoreConfigModel.get("mongo.username"), CoreConfigModel.get("mongo.password").toCharArray() );
         System.out.println("Authentication: "+auth);
         ClassLoader classLoader = Thread.currentThread()
                    .getContextClassLoader();
         InputStream reduceStream = classLoader.getResourceAsStream("/data/mapReduceFunctionsByGroupIdIterative.js");
         String reduce = IOUtils.toString(reduceStream, "UTF-8");
         db.eval(reduce, new BasicDBObject("nolock", true));
        }
        catch (Exception e)
        {
            System.out.println(e);
        }

    }
下面是
MapReduceFunctionsByGroupIDerative.js的内容

 function mapFunction() {
    if (!this.eventdata.Viewed || this.eventdata.Viewed.length === 0) {
        return;
    }
    var key = this.groupid;
    var value = {
        Dockey: this.eventdata.Viewed[0].Dockey,
        PID: this.eventdata.Viewed[0].PID,
        datecreated: this.datecreated,
    entityid: this.entityid
    };
    emit(key, value);
}

function reduceFunction(key, values) {
    function merge(target, firstSource) { 'use strict';
        if (target === undefined || target === null)
            throw new TypeError('Cannot convert first argument to object');

        var to = Object(target);

        var hasPendingException = false;
        var pendingException;

        for (var i = 1; i < arguments.length; i++) {
            var nextSource = arguments[i];
            if (nextSource === undefined || nextSource === null)
                continue;

            var keysArray = Object.keys(Object(nextSource));
            for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
                var nextKey = keysArray[nextIndex];
                try {
                    var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
                    if (desc !== undefined && desc.enumerable)
                        to[nextKey] = nextSource[nextKey];
                } catch (e) {
                    if (!hasPendingException) {
                        hasPendingException = true;
                    pendingException = e;
                }
            }
        }

        if (hasPendingException)
            throw pendingException;
        }
        return to;
    }

    var mostRecentViews = {
        Dockey: {},
        PID: {}
    };

    values.forEach(function (value) {
        var key = value.Dockey ? 'Dockey' : 'PID';
        var reducedValue = {
            profileid: value[key],
            datecreated: value.datecreated,
        entityid: value.entityid
        };
        if (!(value[key] in this[key]) ||
                new Date(value.datecreated) > new Date(this[key][value[key]].datecreated)) {
            this[key][value[key]] = reducedValue;
        }
    }, mostRecentViews);

    var reducedObject = merge({}, mostRecentViews.Dockey, mostRecentViews.PID);

    return reducedObject;
}

function finalizeFunction(key, reducedValue) {
    var finalizedObject = Object.keys(reducedValue).map(function (key, index, array) {
        return reducedValue[key];
    });

    return finalizedObject;
}

var lastrundate = db.TRACKING_DATA.findOne({'_id': 'lastruntimeGroup'}).lastruntime;

db.TRACKING_DATA.mapReduce(mapFunction,
                            reduceFunction,
                            {
                            out: { reduce: "LASTVIEWED_GROUP"},
                            query: { datecreated: 
                                            { $gt: lastrundate }
                                        },
                            finalize: finalizeFunction
                            }
                        )       

db.TRACKING_DATA.update({'_id': 'lastruntimeGroup'},{'_id': 'lastruntimeGroup', 'lastruntime': new Date()},{upsert:true})
我在Java代码中有两个对db one的引用,定义如下:

DB db = mongoClient.getDB( "tracking" );
我的Js代码中的一个应该通过以下方式在mongo shell中运行:

db.eval(reduce, new BasicDBObject("nolock", true));

我已经在shell上运行了js文件,它可以按预期工作,因此我的java代码或调用
db.eval()
做了一些很奇怪的事情。

错误来自javascript。从2.4开始,map reduce中的
db
对象不可用。见附注。Map reduce不应访问Map、reduce或finalize函数中的数据库,这就是不允许引用
db
对象的原因。我没有在Map reduce中调用db。然而,我在JavascriptYes中调用MapReduce是的,你是对的。它是javascript中对db的引用-它不在范围内。传递给eval函数的应该是一个javascript函数。这可能是问题的根源。您也不应该使用eval.ah来清除内容,因此如果eval()只接受一个函数,有没有一种方法可以从java代码中调用一个javascript文件,在mongo上运行,并像直接调用时那样运行,例如:./mongo 127.0.0.1:27017/tracking~/mapReduceFunctionsByEntityIdIterative.js尝试将整个过程包装在一个函数中:D
db.eval(reduce, new BasicDBObject("nolock", true));