Java 使用Mongo DB中的聚合类进行乘法
因此,我通过Maven在Java上使用MongoDB,并使用用于选择的聚合框架。我在托收单上有此文件:Java 使用Mongo DB中的聚合类进行乘法,java,mongodb,aggregation-framework,Java,Mongodb,Aggregation Framework,因此,我通过Maven在Java上使用MongoDB,并使用用于选择的聚合框架。我在托收单上有此文件: { "_id" : "orderKey0", "orderdate" : 3, "shippriority" : 0, "customer" : { "nationKey" : "nationKey0", "mktsegment" : "mktsegment0" },
{
"_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
选择总和(数量)作为总和数量,
总和(扩展价格)作为总和\基本\价格,总和(l \扩展价格*(1-l \折扣))作为
总价
从*
其中shipdate可以使用表达式创建嵌套的算术计算
像下面这样
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);
看起来您可以构建一个原始文档来使用表达式。如“使用聚合表达式”部分所述。然后,您可以使用其中的任何一个进行加法、减法、乘法等操作。看起来您还可以使用新文档
作为分组
的第一个参数,以将其按行项目.linestatus
和行项目.returnflag
进行分组。
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);