当前位置: 首页 > 知识库问答 >
问题:

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

阮选
2023-03-14

我正在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)。

共有1个答案

狄宗清
2023-03-14

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代码: 问题答案: 要么

  • 下面是我的调试代码: