首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mongo查询不触发复合索引。

mongo查询不触发复合索引。
EN

Stack Overflow用户
提问于 2021-12-20 17:50:24
回答 3查看 225关注 0票数 1

我有成千上万份这样的文件:

代码语言:javascript
运行
复制
    {
  "field_id" : "abcd",
  "aField" : 0,
  "parentList": [
      {
        "field": "value1",
        "list": ["element1,element2"]
      }
      , 
      {
        "field": "value2",
        "list": ["element1, element3"]
      }
  ]
}

(这是我的数据库中一个大得多的文档的过半化版本,包含更多的字段。数据库包含数百万份文档)。下面是我想用于计数执行的筛选器:

代码语言:javascript
运行
复制
{ 'parentList.0.list': 
         { '$in': 
            [ 'element1',
              'element2',
              'element3',
              'element4' 
              ] 
            },
        aField: { '$ne': 1 },
        field_id: { '$in': [ 'abcd' ] } 
}

我想要做的是创建这样一个索引:

代码语言:javascript
运行
复制
{"field_id" : 1, "parentList.list" :1, "aField" : 1}

让查询使用它。但蒙戈实际上忽略了这一点。相反,mongo正在使用另一个索引,即

代码语言:javascript
运行
复制
{"field_id":1, "anotherField":1}

执行状态显示了这一阶段:

  1. IXSCAN on {" field_id ":1,"anotherField":1}索引,生成500 k keysExamined,这是具有field_id= 'abcd‘的500 k文档
  2. 获取过滤器的其余部分,返回20k作为计数

当然,如果mongo使用了正确的索引,我希望它已经从IXSCAN检索了20k文档,或者至少更接近这个值。

我只是不明白芒果为什么不使用那个指数。我还试图更改索引中字段的顺序,但没有成功。我用的是Mongo 4.4.6

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-23 15:54:57

解决了

所以这其实很容易解决。MongoDB Compass不允许我在数组的某个位置(在本例中是parentList.0.list)上创建索引,因为当我尝试插入它时,它会自动替换为parentList.list。最后,我发现,如果在shell中执行,对数组的某个位置进行索引实际上是可行的。因此,我在parentList.0.list上创建了索引,索引运行良好。就这样。希望这对其他人也有帮助。

票数 0
EN

Stack Overflow用户

发布于 2021-12-20 18:31:50

Mongo有时会使用错误的索引,我建议您阅读我的答案这里,这解释了为什么会发生这种情况。

为了“修复”应该使用$hint的行为,它将迫使Mongo使用您指定的特定索引。

票数 0
EN

Stack Overflow用户

发布于 2021-12-21 02:25:55

这个索引

代码语言:javascript
运行
复制
{"field_id":1, "anotherField":1}

对数据库的大多数查询工作吗?

根据我的经验,MongoDB通常会选择一个非常通用的索引,即使有时更具体的索引更好。我修正了这一点,使索引更加特定于它们的使用(并移除"catch-all“索引)。我不知道这是否适用于您的用例,因为对所选索引的推理是未知的。

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

https://stackoverflow.com/questions/70426006

复制
相关文章

相似问题

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