mongodb 3 java:聚合键的总和

时间:2017-03-30 13:10:00

标签: java mongodb aggregation-framework mongodb-java

我有_id和searchKey的集合。我想知道每个存储密钥的数量,如" java 2,C ++ 3" 。 我的实体是

public class SearchKeyModel implements Serializable {

    private static final long serialVersionUID = 2099119595418807689L;

    private String searchKey;
    private Integer count;  

这样的聚合:

Iterator<Document> sortedList = collection
            .aggregate(Arrays.asList(new Document("$match", new Document("searchKey", 1)),
                    new Document("$sort", new Document("count", -1)),
                    new Document("$group", new Document("_id", null).append("count", new Document("$sum", 1)
                    ))
            )).iterator();

    System.out.println("list hasNext " + sortedList.hasNext());

    while (sortedList.hasNext()) {
        Document doc = sortedList.next();
        SearchKeyModel entity = gson.fromJson(doc.toJson(), SearchKeyModel.class);
        list.add(entity);
    }
        System.out.println("list size is " + list.size());

但sortedList.hasNext()始终为false。

任何人都可以帮助理解如何完成此操作吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合来获得所需的结果。

添加$project阶段以获取具有与Gson的java类字段名称相同的键名的输出,以正确映射它们。

我还更改了查询以使用静态帮助方法。

List<Bson> aggregation = Arrays.asList(
                Aggregates.group("$searchKey", Accumulators.sum("count", 1)),
                Aggregates.sort(Sorts.descending("count")),
                Aggregates.project(Projections.fields(Projections.excludeId(), Projections.computed("searchKey", "$_id"), Projections.include("count"))));

 Iterator<Document> sortedList = collection.aggregate(aggregation).iterator();