我收集了大量的文档(目前约为1亿,每月上升几百万),每个文档都有由“随机”正整数填充的rule:[]字段(由另一个应用程序模块表示匹配的规则)。字段通常有10到30个整数,但可能会随着时间的推移而增长。在该字段中添加了多键索引(索引本身约为6gb )。
我目前正在用8gb ram和2 4vcpu进行本地测试- mongo,但是有测试集群可用(3个节点,每个4vcpu和10gb)来尝试一些想法。
当我编写一个简单的查询,查找在所述数组中匹配一个整数的文档时,它返回的时间小于20 ms,例如:
db.mycoll.find({ rule: 55 })
db.mycoll.find({ rule: { $elemMatch: { $eq: 55 } } })
// Also, OR seems to be non-issue as well (following query works really fast too):
db.mycoll.find({ rule: { $in: [55, 66, 77] } })但是我需要查询所有有两个或三个整数匹配的文档,这样的查询永远不会少于7-10秒。我尝试了许多组合,但似乎成功的查询计划通常归结为:
db.mycoll.find({ rule: { $all: [55, 66, 77] } })根据我到目前为止所读到的-可能不可能优化这样的查询?有什么可以做的吗?
我是否应该增加资源,尝试将索引与ram相匹配?如果是的话,我如何控制它的钉扎
我甚至对其他选择持开放态度(不过,我更喜欢完全保留在芒果上):
{_id, rule}
1-2-55-66-77-2929这样的数组存储字符串,然后搜索带位掩码的55-66-77字符串instead?发布于 2022-02-27 03:40:55
您是否尝试过使用聚合框架来完成$project阶段,并使用$setIntersection添加了如下新字段:
{
$project: {
remains: {
$setIntersection: [[55, 66, 77], "$rule"]
}
}
}然后使用$match阶段过滤出大小小于2的结果。
https://stackoverflow.com/questions/71281244
复制相似问题