使用Mongo DB中的Aggregates类相乘

时间:2017-04-25 20:25:52

标签: java mongodb aggregation-framework

所以,我通过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);

1 个答案:

答案 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);