数据: 我有 MongoDB 设置来保存有关不同设备的信息。每个设备可以包含多个具有父子关系的节点。每个设备可以适用于多个平台和版本。
预期功能: 用户应该能够搜索部分文本并查看具有此类节点名称的所有设备以及它们适用的所有平台、版本。用户还应该能够过滤一些平台/版本的结果。
样本数据:
{
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"
}
{
device_id:"7f96a17585f028ae13bd0d1a390461e9",
text:"tree-node",
xpath:"/module/active/tree-node"
}
索引:
文件数量: 数据库拥有大量数据,预计数量还会进一步增加。
方法一: 获取搜索字符串的所有结果会出现超时错误。所以我决定执行服务器端分页并且一次只获取 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}
])
我该如何解决这个问题?我应该通过更改聚合查询或重组数据来解决这个问题吗?请给我你的建议。
我有一些优化您的查询的建议:
索引:
{ device_id: 1, platform: 1, release: 1 }
上创建复合索引。node
集合中,确保您在 text
字段上有文本索引。查询优化:
分页:
此版本旨在简化您的建议并提供明确的行动项目。