我正在SpringBootAPI中使用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);
这一切工作得很好。现在在我的总结果上,我经常有相同用户的多个结果,我想显示分页列表中的那些,但我也想显示一个新的计数器,其中包含搜索中的总不同用户。
我看到了发现。不同的参数
mongoTemplate.findDistinct(query, "userId", OnboardingItineraryEntity.class, String.class);
但是我不想检索一个巨大的列表并对其进行计数。有没有一种方法可以轻松做到:
mongoTemplate.countDistinct(query, "userId", OnboardingItineraryEntity.class, String.class);
因为我有大量的条件,所以我觉得必须从头开始重建聚合对象很难过?
另外一个问题是,有时userId将为null,是否有一种简单的方法在一个查询中计算null的不同(非null)数?或者我需要做一个查询,当我在userId为null的情况下添加一个额外的条件时,对其进行计数,然后对all进行不同的计数,并在我的代码中手动地将它们相加(减1)。
MongoDB聚合通过几种方式解决了这个问题。
db.myEntity.aggregate([
{$match:...}, //add here MatchOperation
{
"$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
}
]
db.myEntity.aggregate([
{$match:...}, //add here MatchOperation
{
"$group": {
"_id": "",
"null": {
$sum: {
$cond: [
{
$ne: [{ "$type": "$userId"}, "string"]
},
1,
0
]
}
},
"nonNull": {
"$sum": {
$cond: [
{
$eq: [{ "$type": "$userId" }, "string"]
},
1,
0
]
}
}
}
}
])
MongoPlayground
---输出---
[
{
"_id": "",
"nonNull": 4,
"null": 3
}
]
db.myEntity.aggregate([
{$match:...}, //add here MatchOperation
{
$facet: {
"null": [
{
$match: {
$or: [
{
userId: {
$exists: false
}
},
{
userId: null
}
]
}
},
{
$count: "count"
}
],
"nonNull": [
{
$match: {
$and: [
{
userId: {
$exists: true
}
},
{
userId: {
$ne: null
}
}
]
}
},
{
$count: "count"
}
]
}
},
{
$project: {
"null": {
$ifNull: [
{
$arrayElemAt: [
"$null.count",
0
]
},
0
]
},
"nonNull": {
$ifNull: [
{
$arrayElemAt: [
"$nonNull.count",
0
]
},
0
]
}
}
}
])
MongoPlayground
注意:尝试这些解决方案中的任何一种,如果您在创建MongoDB聚合时遇到任何问题,请告诉我。
考虑到我有一个FixSturyQueQue1,它返回10个文档和另一个查询QuyR2,返回15个文档,但是这15, 5个文档中的时间对于QueRe1和QueRe2都是通用的。对于第二个查询,在支持持久性的平台中,读取计数是10还是15?
当我通过此查询计算日期中的不同年份时 这给了我一个错误 经过调查,我发现了一个问题:-spring JPA@查询错误,应为CLOSE,在附近找到“(” 是否有任何解决方法可以在没有本机查询的情况下获得不同的年份?
问题内容: 我需要在一个查询中计算两列中某些数据的出现总数。数据库位于SQL Server 2005中。 例如,我有此表: 我需要查询一个结果: 1.名为“约翰”的人数 2.年龄超过30岁的“约翰”的人数。 我可以通过这种方式对子查询进行操作(这只是示例): 但这非常慢,我正在寻找更快的方法。 与使用子查询相比,您是否知道一种更好的方法来计算一个查询中的少量计数? 问题答案: 使用CASE语句,您
问题内容: 这是下面给出的当前复杂查询。 还有另一列Training.TCode。我需要计算不同的Training.TCode,有人可以帮助我吗?如果您需要更多信息,请告诉我 问题答案: 尝试 编辑-现在请看一下… 采取以下SQL代码。第一个选择是SQL Server如何执行此操作,第二个查询应符合访问权限… 它返回以下内容:
问题内容: 我应该将“如果查询结果行IS = 1进行验证的代码”替换为什么? 我已经尝试过使用num_rows的多种方法,但无法正常工作。 我的PHP代码: 问题答案: 要么
下面是我的调试代码: