【问题标题】:Raw javascript mongodb queries using db.eval() in java在 java 中使用 db.eval() 的原始 javascript mongodb 查询
【发布时间】:2013-04-26 15:04:11
【问题描述】:

目前我正在用 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
    });

【问题讨论】:

  • 为什么需要将此作为脚本传递?为什么不使用 mongodb java 驱动程序并将这些作为普通查询/命令/等执行?
  • 补充一点,我认为 JS 引擎在这里不会给你带来任何好处,事实上它可能(可能)会带来更多的坏处
  • 实际上我正在研究 TPC-H 基准测试,我正在尝试比较不同 DBMS 的原始查询的查询响应时间和网络延迟,其中 MongoDB 就是其中之一,这些原始查询由基准定义,我不知道如何将它们转换为使用 MongoDB java 驱动程序。当我在 db.eval() 中尝试简单的 javascript 查询时,它能够运行它们,但是当我尝试使用整个脚本时出现异常。
  • 另外我没有太多时间将所有这些原始查询转换为 Mongodb Java 驱动程序格式,因为我有 27 个复杂查询,我必须尽快得到结果。

标签: java mongodb mongodb-query mongodb-java


【解决方案1】:

看起来你正在尝试做一个 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;
 }
})

然后用

在 shell 中运行它
db.eval("echoFunction('test')")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2013-07-31
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多