我在MongoDB中有一个查询,它产生了我想要的结果。但是现在我正在尝试在Java中使用它。
这是在MongoDB中的查询:
现在我正在使用Java,但我不知道如何使用avg函数。
我该如何使用那个功能?
这是在MongoDB中的查询:
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.lineitems.group( {
key : { returnflag : true, linestatus : true},
cond : { "shipdate" : {$lte: 19980801}},
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
});
现在我正在使用Java,但我不知道如何使用avg函数。
String avg = "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;};";
String reduce = "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;};";
String finalize = "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;};";
MapReduceIterable<Document> iterable = collection.mapReduce(**????**, reduce).finalizeFunction(finalize);
我该如何使用那个功能?
.aggregate()
不仅更“容易”,而且实际上性能远远优于mapReduce。mapReduce无法在性能或规模上与.aggregate()
竞争。而且你还得到了Java代码。你的评论表明你没有完全阅读答案。我建议你阅读并学习它的教训。 - Blakes Seven.group()
方法的。因此,即使JavaScript代码已经编写好了,也需要进行相当大的修改才能适应mapReduce
。所以你要么在Java中调用.group()
,要么改变所有的mapReduce
代码。但总的来说,你不应该这样做。使用如上所示的.aggregate()
更好。这就是你应该学习的内容。 - Blakes Seven.aggregate()
选项。 - duknust