0

目前我正在用 JAVA 开发一个项目,我需要通过 JAVA 运行 Javascript Mongo 查询,我想我可以在 java 中使用 db.eval() 来做类似的事情。问题是我对 Mongo 有以下 Javascript 查询,但我不知道如何将整个脚本传递给 db.eval() 方法。任何想法 ?请告诉我。谢谢你

    var red = function(doc, out) {
    out.count_order++;
    out.sum_qty += doc.quantity;
    out.sum_base_price += doc.extendedprice;
    out.sum_disc_price += doc.extendedprice * (1 - doc.discount);
    out.sum_charge += doc.extendedprice * (1 - doc.discount) * (1 + doc.tax);
    out.avg_disc += doc.discount 
    };
    var avg = function(out) {
    out.avg_qty = out.sum_qty / out.count_order;
    out.avg_price = out.sum_base_price / out.count_order;
    out.avg_disc = out.avg_disc / out.count_order 
    };
    db.deals.group( {
    key : { RETURNFLAG : true, LINESTATUS : true},
    cond : { "SHIPDATE" : {$lte: new Date(1998, 8, 1)}},
    initial: { count_order : 0, sum_qty : 0, sum_base_price : 0, sum_disc_price : 0,
    sum_charge : 0, avg_disc : 0},
    reduce : red,
    finalize : avg
    });
4

1 回答 1

0

看起来你正在尝试做一个 mapreduce 并且 Java 驱动程序抽象了这个过程并使事情复杂化,但我认为你问题的核心是如何 1)存储 js 函数和 2)在 Java 中运行它们

我将首先通过一个示例解决 2)(我修改了您的函数以返回“out”,因为我认为对于使用驱动程序的 mapreduce 操作,这需要以不同方式处理):

String fnc = "function(doc, out) {" +
    "out.count_order++;"+
    "out.sum_qty += doc.quantity;"+
    "out.sum_base_price += doc.extendedprice;"+
    "out.sum_disc_price += doc.extendedprice * (1 - doc.discount);"+
    "out.sum_charge += doc.extendedprice * (1 - doc.discount) * (1 + doc.tax);"+
    "out.avg_disc += doc.discount; "+
    "return out;" +
    "};";

   BasicDBObject doc = BasicDBObject("_id","doc");
   BasicDBObject out = BasicDBObject("_id","out");

System.out.println(
   (new MongoClient()).getDB('test').eval(fnc,doc,out)
);

WRT 1)(保存功能)...您可以将服务器中的功能保存在集合中。但是我还没有能够让 Java 驱动程序找到它们。在 mongoshell 中,你可以这样做(这个例子来自Call stored function in mongodb):

system.js.save({
_id: "echoFunction",
value: function (x) {
    return 'echo: ' + x;
 }
})

并在外壳中运行它

db.eval("echoFunction('test')")
于 2014-12-06T04:09:35.407 回答