java - 在单个查询中获取文档和它们的总数包括分页

标签 java spring mongodb spring-data

我是 mongo 新手,使用 mongodb 聚合框架 进行查询。我需要检索一些满足特定条件(包括分页+排序) 的记录,还需要获取记录的总数

现在,我执行后续步骤:

  1. 创建$match操作符
    { "$match": { "year": "2012", "author.authorName": { "$regex": "au", "$options": "i"}}}
  2. 添加了排序和分页
    { "$sort": { "some_field": -1}} , { "$limit": 10} , { "$skip": 0}

查询后我收到了预期的结果:10 个包含所有字段的文档。

对于分页,我需要知道满足这些条件的记录总数,在我的例子中是 25。

我使用下一个查询来获取计数:{ "$match": { "year": "2012", "author.authorName": { "$regex": "au", "$options": "i"}}} , { "$group": { "_id": "$all", "reviewsCount": { "$sum": 1}}} , { "$sort": { "some_field": - 1}} , { "$limit": 10} , { "$skip": 0}

但我不想执行两个单独的查询:一个用于检索文档,另一个用于满足特定条件的记录总数。

我想在一个单个查询中完成并获得下一种格式的结果:

{
        "result" : [
                {
            "my_documets": [
                        {
                        "_id" : ObjectId("512f1f47a411dc06281d98c0"),
                        "author" : {
                                "authorName" : "author name1",
                                "email" : "email1@email.com"
                            }
                        },
                        {
                        "_id" : ObjectId("512f1f47a411dc06281d98c0"),
                        "author" : {
                                "authorName" : "author name2",
                                "email" : "email2@email.com"
                            }
                        }, .......

                    ],
                    "total" : 25
                }
        ],
        "ok" : 1
}

我尝试修改组运算符:{ "$group": { "_id": "$all", "author": "$author""reviewsCount": { "$sum": 1}} 但在这种情况下,我得到了:“异常(exception):组聚合字段'author'必须定义为对象内的表达式”。如果在 _id 中添加所有字段,则 reviewsCount 始终 = 1,因为所有记录都不同。

没有人知道如何在单个查询中实现它?也许 mongodb 有一些针对这种情况的功能或运算符?使用两个单独的查询实现会降低查询数千或数百万记录的性能。在我的应用程序中,这是非常关键的性能问题。

我整天都在研究这个问题,但一直找不到解决方案,所以我想求助于 stackoverflow 社区。

谢谢。

最佳答案

您可以尝试在聚合管道中使用 $facet 作为

db.name.aggregate([
{$match:{your match criteria}},
{$facet: {
       data: [{$sort: sort},{$skip:skip},{$limit: limit}],
       count:[{$group: {_id: null, count: {$sum: 1}}}]
}}
])

在数据中,您将获得带有分页的列表,在计数中,计数变量将包含匹配文档的总数。

关于java - 在单个查询中获取文档和它们的总数包括分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15132725/

相关文章:

c# - 更新与替换的MongoDB含义

java - maven资源插件错误

Java数组异常

java - Protocol Buffers : How to parse a . Java 原型(prototype)文件

spring - Spring 有没有像温莎城堡那样的@predestroy

java - Spring Singleton 更新集

基于payload属性的java消息路由

java - 在 Linux 上读取 Windows 文本文件 --- MIME 问题?

c# - MongoDB C#官方驱动: Mapping objects to short names to limit space

javascript - MongoDB:为什么 Array.find on comments(数组)属性返回未定义?