SpringData MongoDb,如何计算查询的不同?

问题描述 投票:0回答:1

我正在Springboot API中使用mongoDb进行分页搜索。

对于客户搜索路径,我正在根据一系列用户输入条件建立一个查询。然后,我进行计数以显示结果总数(以及计算出的相关页面数)

  Long total = mongoTemplate.count(query, MyEntity.class);

然后我执行分页查询以仅返回当前页面结果

query.with(PageRequest.of(pagination.getPage(), pagination.getPageSize()));
query.with(Sort.by(Sort.Direction.DESC, "creationDate"));
List<MyEntity> listResults = mongoTemplate.find(query, MyEntity.class);

一切正常。现在,在我的总结果中,我经常对同一用户有多个结果,我想在分页列表中显示这些结果,但我也想对那个搜索中的总不同用户显示一个新的计数器。

我看到了findDistinct参数

mongoTemplate.findDistinct(query, "userId", OnboardingItineraryEntity.class, String.class);

但是我不想检索庞大的列表并依靠它。有没有一种方法可以轻松做到:

    mongoTemplate.countDistinct(query, "userId", OnboardingItineraryEntity.class, String.class);

因为我的标准数量庞大,所以觉得难过不得不从头开始重新构建一个聚合对象吗?

奖金问题,有时userId将为null,是否有一种简便的方法可以在一个查询中计算不同(非null)的数量+ null的数量?还是我需要做一个查询,当我在userId上添加一个额外的criteira为null时,对此进行计数,然后对所有计数进行计数,然后手动将它们加到我的代码中(减去1)。

mongodb spring-data distinct
1个回答
0
投票

MongoDB aggregation通过多种方式解决了这个问题。

$type运算符聚合:

db.myEntity.aggregate([
  {
    "$group": {
      "_id": {
        "$type": "$userId"
      },
      "count": {
        "$sum": 1
      }
    }
  }
])

MongoPlayground

-Ouput ---

[
  {
    "_id": "null", //null values
    "count": 2
  },
  {
    "_id": "missing", // if userId doesn't exists at all
    "count": 1
  },
  {
    "_id": "string", //not null values
    "count": 4
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.