Spring数据mongodb聚合场景

时间:2015-04-21 10:33:44

标签: mongodb spring-data-mongodb

我该如何翻译

$group : {
   _id :  1 ,
    likes    : { $avg: { $size: ["$likes"] }},
    count:   { $sum: 1 },
 }

进入spring-data-mongodb聚合查询?

2 个答案:

答案 0 :(得分:2)

您可以使用以下代码:

ArrayList<String> list = new ArrayList<>();
list.add("$likes");

BasicDBObject idObj = new BasicDBObject("_id", 1);
BasicDBObject likesObj = new BasicDBObject("$avg", new BasicDBObject("$size", list));
BasicDBObject countObj = new BasicDBObject("$sum", 1);

idObj.append("likes", likesObj).append("count", countObj);
BasicDBObject group = new BasicDBObject("$group", idObj);


List<DBObject> pipeline = new ArrayList<>();
pipeline.add(group);

MongoTemplate mongoTemplate = new MongoTemplate(new MongoClient(), "dbname");
AggregationOutput aggregationOutput = mongoTemplate.getCollection("collectionName")
        .aggregate(pipeline);
List<DBObject> dbObjects = (List<DBObject>) aggregationOutput.results();

//convert dbObjects into appropriate output

答案 1 :(得分:2)

对于Spring数据mongodb,您也可以使用以下方式

List<AggregationOperation> stages = new ArrayList<>();

GroupOperation groupOperation = group()
                                    .count().as("count")
                                    .avg(ArrayOperators.Size.lengthOfArray("likes")).as("likes");

stages.add(groupOperation);

AggregationResults<ResultDTO> result = mongoOperation.aggregate(newAggregation(stages),
        "collectionName", ResultDTO.class);


public class ResultDTO {

   private Integer count;

   private Double  likes;

   //getter setter

}