2017-04-25 3 views
0

So verwende ich MongoDB auf Java über Maven und das Aggregation Framework für die Auswahl. Ich habe dieses Dokument auf den Sammelbestellungen:Multiplizieren mit Klasse Aggregate in Mongo DB

{ 
     "_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 
     } 
    } 

Ich brauche diese wählen zu tun:

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 

Ich weiß nicht, wie zu multiplizieren und subtrahieren die Aggregate-Klasse, eine Idee? Ich bin wirklich blockiert: S Hinweis Ich habe in den Sammlungen mehr Dokumente für die Verwendung der Gruppe durch. Das habe ich mit dem Aggregation Framework gemacht.

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

Es sieht aus wie Sie ein rohes Dokument erstellen können einen Ausdruck zu verwenden. wie im Abschnitt "Aggregationsausdrücke verwenden" [hier] beschrieben (http://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/aggregation/). Sie können dann einen dieser [Ausdrücke] (https://docs.mongodb.com/manual/reference/operator/aggregation/#expression-operators) verwenden, um Addition, Subtraktion, Multiplikation usw. durchzuführen. Es sieht so aus, als könnten Sie auch in der Lage sein, ein 'neues Dokument' als erstes Argument für' group' zu verwenden, um es sowohl von 'lineeitems.linestatus' als auch von' lineitems.returnflag' zu gruppieren. –

Antwort

0

Sie können Ausdrücke verwenden, um verschachtelte arithmetische Berechnungen zu erstellen.

So etwas wie unten

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