MongoDB 服务器端分页,具有查找、内连接和限制功能

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

数据: 我有 MongoDB 设置来保存有关不同设备的信息。每个设备可以包含多个具有父子关系的节点。每个设备可以适用于多个平台和版本。

预期功能: 用户应该能够搜索部分文本并查看具有此类节点名称的所有设备以及它们适用的所有平台、版本。用户还应该能够过滤一些平台/版本的结果。

样本数据:

  1. 发布合集:
{
device_id:"7f96a17585f028ae13bd0d1a390461e9", 
device-name:"apts26v", 
platform:"bj5000", 
release:"10.0"
}
{
device_id:"7f96a17585f028ae13bd0d1a390461e9", 
device-name:"apts26v", 
platform:"bj5000", 
release:"10.5"
}
{
device_id:"7f96a17585f028ae13bd0d1a390461e9", 
device-name:"apts26v", 
platform:"rex9000", 
release:"10.5"
}
  1. 节点集合:
{
device_id:"7f96a17585f028ae13bd0d1a390461e9",
text:"tree-node", 
xpath:"/module/active/tree-node"
}

索引:

  1. 我在版本集合中有一个设备 ID、平台和版本的索引
  2. 我在文本的节点集合中有一个文本索引

文件数量: 数据库拥有大量数据,预计数量还会进一步增加。

  1. 发布集合有大约 400k 文档
  2. 节点集合约有 3500 万个文档

方法一: 获取搜索字符串的所有结果会出现超时错误。所以我决定执行服务器端分页并且一次只获取 50 行。如果我只是对节点集合执行搜索并将其限制为 50 行,则查询工作正常。但是当我使用版本集合执行查找时,删除没有选择平台和版本的行,然后限制 50 行,查询会出现超时错误。

方法2: 如果我在限制阶段之后执行平台过滤和发布,则会返回结果,但每个页面中的文档数量不同。如果前 50 条查询结果中,如果只有 10 条适用于所选平台和版本,则首页将只有 10 条。

聚合:

node.aggregate([
{
      "$match": {
                  "text":{
                    "$regex":search_text,
                    "$options":"i"
                  }
                }
            },
            { "$sort": { "device_id": 1 ,"text":1} },
            {
                  "$lookup": {
                        "from": "release",
                        "let": { "deviceId": "$device_id" },
                        "pipeline": [
                              { 
                                    "$match": {
                                          "platform": "rex9000",
                                          "release":"10.5",
                                          "$expr": { "$eq": [ "$$deviceId", "$device_id" ] }
                                    }
                              }
                        ],
                        "as": "releasePlatformInfo"
                  }
            },
            {
                  "$match": {
                        "releasePlatformInfo": {"$ne": []}
                  }
            },
            {"$skip": 0},
            {"$limit": 50}
        ])

我该如何解决这个问题?我应该通过更改聚合查询或重组数据来解决这个问题吗?请给我你的建议。

mongodb aggregation
1个回答
0
投票

我有一些优化您的查询的建议:

  1. 索引

    • 为了获得更好的性能,请在
      { device_id: 1, platform: 1, release: 1 }
      上创建复合索引。
    • node
      集合中,确保您在
      text
      字段上有文本索引。
  2. 查询优化:

    • 在执行查找之前应用匹配过滤器。在查找之前过滤数据可以减少处理的数据量并防止超时,尤其是对于大型集合。
  3. 分页:

    • 使用服务器端分页时,请在过滤后应用分页,以保持页面之间的一致性。为此,首先确定与您的过滤器匹配的文档总数,然后根据此过滤结果集进行分页。

此版本旨在简化您的建议并提供明确的行动项目。

© www.soinside.com 2019 - 2024. All rights reserved.