2017-05-05 1 views
0

J'ai une collection de commandes et orderLastStatusChangeDatetime, estimateDeliveryDatetime et orderPrice sont classés nom de la collection de commandes. Je dois obtenir la somme de orderPrice où orderLastStatusChangeDatetime est égal ou inférieur à estimateDeliveryDatetime. J'ai utilisé la requête ci-dessous pour obtenir l'enregistrement total ...printemps mongodb agrégation comparer deux champ et obtenir la somme d'une colonne

Criteria criteria = new Criteria() { 
     @Override 
     public DBObject getCriteriaObject() { 
      DBObject obj = new BasicDBObject(); 
      obj.put("$where", "this.orderLastStatusChangeDatetime <= this.estimatedDeliveryDatetime"); 
      return obj; 
     } 
    }; 

    Query query = new Query(); 


    query.addCriteria(criteria); 


    totalOrder = (int) mongoTemplate.count(query,ORDERS_COLLECTION_NAME); 

Mais je dois obtenir la somme du prix de la commande. J'ai utilisé les mêmes critères dans la correspondance d'agrégation. Mais il donne une erreur "La commande a échoué avec l'erreur 16395: 'exception: $ where n'est pas autorisé dans une expression d'agrégation $ match'"

Répondre

1

Vous pouvez utiliser le pipeline d'agrégation ci-dessous. Crée un champ cmp en $project stade pour maintenir le résultat de orderLastStatusChangeDatetime <= estimatedDeliveryDatetime suivie par $match avec cmp égale à true et $group avec $sum la order price.

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; 
import static org.springframework.data.mongodb.core.query.Criteria.where; 

Aggregation aggregation = newAggregation(project("orderPrice").andExpression("orderLastStatusChangeDatetime <= estimatedDeliveryDatetime").as("cmp"), match(Criteria.where("cmp").is(true)), group().sum("orderPrice").as("total")); 

BasicDBObject results = mongoOperations.aggregate(aggregation, ORDERS_COLLECTION_NAME, BasicDBObject.class).getUniqueMappedResult(); 
int totalOrder = results.getInt("total"); 

Mise à jour: Utilisation AggregationExpression en 1.8.5 DE PRESSE

Aggregation agg = newAggregation(
    project("orderPrice").and(new AggregationExpression() { 
       @Override 
       public DBObject toDbObject(AggregationOperationContext context) { 
        return new BasicDBObject("$lte", Arrays.<Object>asList("$orderLastStatusChangeDatetime", "$estimatedDeliveryDatetime")); 
        } 
    }).as("cmp"), 
    match(Criteria.where("cmp").is(true)), 
    group().sum("orderPrice").as("total") 
); 
+0

Merci pour votre aide Veeram rapide ... Mais je recevais erreur --- – Pankaj

+0

java.lang.IllegalArgumentException: Élément non pris en charge: org .springframework.data.mongodb.core.spel.OperatorNode @ 542dba3f Type: classe org.springframework.data.mongodb.core.spel.OperatorNode Vous avez probablement une erreur de syntaxe dans votre expression SpEL! – Pankaj

+0

Vous êtes les bienvenus. J'ai été capable de courir avec succès sur la version 1.10.1 printemps mongo. Pouvez-vous me montrer le code et quelle version utilisez-vous? C'est la requête que je vois sur le serveur '{" $ project ": {" orderPrice ": 1," cmp ": {" $ lte ": [" $ orderLastStatusChangeDatetime "," $ estiméDeliveryDatetime "]}}}, {" $ match ": {" cmp ": true}}, {" $ groupe ": {" _id ": null," total ": {" $ sum ":" $ orderPrice "}}}' – Veeram