3
我在mongoDB中有這個查詢,並且產生我想要的結果。但現在我試圖在java中使用它。如何用Java運行.group()
這是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中的方式,但我不知道如何使用平均功能。
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);
如何使用該功能?
,但我知道我必須使用聚合框架的解決方案,我需要地圖相同的結果降低到比較...我需要使用Java調用這兩種情況。 – duknust
@duknust你爲什麼認爲你需要mapReduce?這裏的解釋告訴你,使用'.aggregate()它不僅「更容易」,它實際上是遠遠更好的表現。 mapReduce不可能通過'.aggregate()'與性能或規模進行競爭。你也得到了Java代碼。你的評論表明你還沒有完全閱讀答案。我建議你這樣做,並學習它的教訓。 –
@duknust當然,這裏的另一件事是你的編碼函數以及你在shell中嘗試的是''.group()'](https://docs.mongodb.org/manual/reference/method /db.collection.group/)方法。所以即使是JavaScript代碼也需要進行相當大的修改才能適應已經編碼過的mapReduce。所以你要麼在Java中調用'.group()',要麼改變'mapReduce'的所有代碼。但是這裏總的概要是你不應該這樣做。如圖所示使用'.aggregate()'。這太好了。這就是你想要在這裏學習的東西。 –