2017-04-25 101 views
0

所以,我通過Maven使用MongoDB和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 

我不知道如何繁殖和使用的。減去骨料級,任何想法?我真的被封鎖了: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

看起來你可以建立一個原始文檔時使用的表達式。如「使用聚合表達式」部分[此處](http://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/aggregation/)中所述。然後你可以使用[這些表達式](https://docs.mongodb.com/manual/reference/operator/aggregation/#expression-operators)中的任何一個來進行加法,減法,乘法等等。看起來你也可能能夠使用'new Document'作爲'group'的第一個參數,以便通過'lineitems.linestatus'和'lineitems.returnflag'對其進行分組。 –

回答

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