首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用多个条件索引和查询数组字段($all操作符)

如何用多个条件索引和查询数组字段($all操作符)
EN

Stack Overflow用户
提问于 2022-02-27 00:19:43
回答 1查看 89关注 0票数 0

我收集了大量的文档(目前约为1亿,每月上升几百万),每个文档都有由“随机”正整数填充的rule:[]字段(由另一个应用程序模块表示匹配的规则)。字段通常有10到30个整数,但可能会随着时间的推移而增长。在该字段中添加了多键索引(索引本身约为6gb )。

我目前正在用8gb ram和2 4vcpu进行本地测试- mongo,但是有测试集群可用(3个节点,每个4vcpu和10gb)来尝试一些想法。

当我编写一个简单的查询,查找在所述数组中匹配一个整数的文档时,它返回的时间小于20 ms,例如:

代码语言:javascript
复制
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秒。我尝试了许多组合,但似乎成功的查询计划通常归结为:

代码语言:javascript
复制
db.mycoll.find({ rule: { $all: [55, 66, 77] } })

根据我到目前为止所读到的-可能不可能优化这样的查询?有什么可以做的吗?

我是否应该增加资源,尝试将索引与ram相匹配?如果是的话,我如何控制它的钉扎

我甚至对其他选择持开放态度(不过,我更喜欢完全保留在芒果上):

{_id, rule}

  • use
  • 使用不同的集合插入关系数据库的组合?
    • 使用其他一些技术-例如。让mongo存储数据,redis或其他什么东西提供快速查找?(可能提高mongo内存限制会以其他方式提供类似的effect?)
    • Store数据,这样可以更容易地搜索(假设其排序的int数组),例如:
      • 而不是像1-2-55-66-77-2929这样的数组存储字符串,然后搜索带位掩码的55-66-77字符串instead?
      • Play?例句:对象数组,每个对象都有用于规则ids的32或64位。维护和可靠地构建查询有点困难。
      • 任何其他的
EN

回答 1

Stack Overflow用户

发布于 2022-02-27 03:40:55

您是否尝试过使用聚合框架来完成$project阶段,并使用$setIntersection添加了如下新字段:

代码语言:javascript
复制
{
  $project: {
    remains: {
      $setIntersection: [[55, 66, 77], "$rule"]
    }
  }
}

然后使用$match阶段过滤出大小小于2的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71281244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档