所以,我通过Maven和聚合框架在Java上使用MongoDB进行选择。我在收集订单上有这个文件:
{
"_id" : "orderKey0",
"orderdate" : 3,
"shippriority" : 0,
"customer" : {
"nationKey" : "nationKey0",
"mktsegment" : "mktsegment0"
},
"lineitems" : {
"suppkey" : "suppkey1",
"quantity" : 9,
"extendedPrice" : 45,
"discount" : 18,
"tax" : 0,
"returnflag" : "b",
"linestatus" : "c",
"shipdate" : 4,
"shipingdate" : 1
}
}
我需要选择:
SELECT sum(quantity) as sum_qty,
sum(extendedprice) as sum_base_price, sum(l_extendedprice*(1-l_discount)) as
sum_disc_price
FROM *
WHERE shipdate <= '[date]'
GROUP BY returnflag, linestatus
我不知道如何使用Aggregates类进行乘法和减法,任何想法?我真的被阻止了:S 注意我在集合中有更多文档供集团使用。 这就是我对聚合框架所做的工作。
MongoCollection<Document> ordersCollection = database.getCollection("orders");
ordersCollection.aggregate(
Arrays.asList(
Aggregates.unwind("$lineitems"),
Aggregates.match(Filters.lte("lineitems.shipdate", 10)),
Aggregates.group("$lineitems.linestatus",
Accumulators.sum("sum_qty", "$lineitems.quantity"),
Accumulators.sum("sum_base_price", "$lineitems.extendedPrice"))
)
).forEach(printBlock);
答案 0 :(得分:0)
您可以使用表达式创建嵌套算术计算。
如下所示
Document groupFields = new Document();
groupFields.append("linestatus", "$lineitems.linestatus");
groupFields.append("returnflag", "$lineitems.returnflag");
Document subtractDisc = new Document("$subtract", Arrays.asList(1, "$lineitems.discount"));
Document multiplyDisc = new Document("$multiply", Arrays.asList("$lineitems.extendedPrice", subtractDisc));
ordersCollection.aggregate(
Arrays.asList(
Aggregates.unwind("$lineitems"),
Aggregates.match(Filters.lte("lineitems.shipdate", 10)),
Aggregates.group(groupFields,
Accumulators.sum("sum_qty", "$lineitems.quantity"),
Accumulators.sum("sum_base_price", "$lineitems.extendedPrice"),
Accumulators.sum("sum_disc_price", multiplyDisc)
)
)
).forEach(printBlock);