Bu sorguyu mongoDB'de alıyorum ve istediğim sonucu üretiyor. Ama şimdi onu java'da kullanmaya çalışıyorum. Java ile bir .group() nasıl çalıştırılır
Bu
MongoDB sorgu geçerli: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
});
Ve şimdi Java kullanıyorum yolu ama ort fonksiyonunu nasıl kullanılacağını bilmiyorum.
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);
Bu işlevi nasıl kullanabilirim?
gibi Her iki durumda da. – duknust
@duknust Neden haritaya ihtiyacınız olduğunu düşünüyorsunuz? Buradaki açıklama, '.aggregate()' yi kullanarak "daha kolay" olmanın yanı sıra, aslında ** daha ** daha fazla performansın olduğunu gösterir. MapReduce'un ".aggregate()" ile performans veya ölçek üzerinde rekabet etmesi mümkün değildir. Ve Java kodunu da aldınız. Yorumunuz, cevabı tam olarak okumadığınızı gösterir. Yapmanı öneririm ve derslerini öğrenirim. –
@duknust Tabii ki burada diğer bir şey de kodlanmış fonksiyonlarınızın yanı sıra kabukta çalıştığınız şeylerin ['.group()'] için olmasıdır (https://docs.mongodb.org/manual/reference/method /db.collection.group/) yöntemi belirtildiği gibi. Bu yüzden, JavaScript kodu bile 'mapReduce' 'u zaten kodladığınızdan sığdırmak için önemli bir değişiklik yapılmasını gerektirecektir. Bu yüzden ya Java'da '.group()' ı, ya da 'mapReduce' için tüm kodu değiştirirsiniz. Ama genel özeti, bunu yapmamanız gerektiğidir. Gösterildiği gibi '.aggregate() kullanın. Bu daha iyi. Burada öğrenmeniz gereken şey budur. –