2

mongoDB と spring でフィールドの平均を計算する方法。端末で使用する $avg() 関数がありますが、mongotemplate で実行する方法を説明します。

たとえば

 db.sales.aggregate(
    [
     {
       $group:
         {
           _id: "$item",
           avgAmount: { $avg: { $multiply: [ "$price", "$quantity" ] } },
           avgQuantity: { $avg: "$quantity" }
         }
     }
   ]
)

ここで平均を計算しているので、mongotemplate でどのように実行できますか。

今、関数を使用して平均評価を取得しています

私はこのような機能を使用しています..

public List getrating() {

    TypedAggregation<RatingReviewModel> agg = newAggregation(RatingReviewModel.class,

           group("hospitalid")            
            .avg("rating").as("avgrating")
    );

    AggregationResults<DBObject> result = operations.aggregate(agg, DBObject.class);
    List<DBObject> resultList = result.getMappedResults();

return resultList;
}

ただし、デバッグ時にはresultListは空であるため、何も返されません。

4

1 に答える 1

2

Sale オブジェクトが次のように定義されているとします。

class Sale {
    String id;
    String item;
    double price;
    int quantity;
}

mongotemplate を使用すると、計算フィールドを取得するために事前にパイプラインのステージが必要になります。ネイティブの MongoDB 集計では、集計を 2 つのステージに分割するのではなく$project、1 つの操作パイプラインですべてが行われるため、これは少し直感に反する可能性があります。 $group:

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

TypedAggregation<Sale> agg = newAggregation(Sale.class,
      project("quantity")
         .andExpression("price * quantity").as("totalAmount"),
      group("item")            
        .avg("totalAmount").as("avgAmount")
        .avg("quantity").as("avgQuantity")
);

AggregationResults<DBObject> result = mongoTemplate.aggregate(agg, DBObject.class);
List<DBObject> resultList = result.getMappedResults();

上記は、ネイティブJava ドライバー実装を使用して実現することもできます。

ApplicationContext context = new AnnotationConfigApplicationContext(SpringMongoConfig.class);
MongoOperations operation = (MongoOperations) context.getBean("mongoTemplate");

BasicDBList pipeline = new BasicDBList();
String[] multiplier = { "$price", "$quantity" };

pipeline.add(
    new BasicDBObject("$group",
        new BasicDBObject("_id", "$item")
        .append("avgAmount", new BasicDBObject(
            "$avg", new BasicDBObject(
                "$multiply", multiplier
            )
        ))
        .append("avgQuantity", new BasicDBObject("$avg", "$quantity"))
    )
);

BasicDBObject aggregation = new BasicDBObject("aggregate", "sales")
                            .append("pipeline", pipeline);
System.out.println(aggregation);
CommandResult commandResult = operation.executeCommand(aggregation);
于 2015-03-27T12:35:41.120 に答える