指南
MongoDB在4.2 版本推出了Wildcard Indexes,究竟什么是Wildcard Indexes以及Wildcard Indexes适合哪些场景本文结合官方文档以及实际测试进行简单概述。
1、通配符索引示例
因为MongoDB是dynamic schemas,所以应用是可以查询任何已知字段或者随机字段的。
假设(此假设案例摘自官方文档),集合colA的UserMetadata字段包含如下数据:
注意:首先应该明确的是通配符索引只在版本兼容性4.2的时候才能创建。如何查询版本兼容性?
2、通配符索引的形式单字段通配符索引
3、通配符索引的行为通配符索引的行为根据其字段类型不同而有所不同。
通配符索引对于显示数组位置的查询
通配符索引虽然不会记录给定数组中的元素下标,但是,MongoDB仍然可以选择通配符索引来满足包含一个或多个显式数组索引的字段路径的查询(for example, parentArray.0.nestedArray.0)
由于为每个连续嵌套数组定义索引边界的复杂性日益增加,如果该路径包含8个以上的显式数组索引,MongoDB不会考虑使用通配符索引来回答查询中的给定字段路径。MongoDB仍然可以考虑使用通配符索引来回答查询中的其他字段路径。
如果超过了8个以上显示数组索引的话MongoDB 会考虑另外的索引或者执行全集合扫描。如下结构:
4、通配符索引的限制1.首先通配符索引是一个稀疏索引,只存放存在的字段在索引里面,不存在的不存放,也就是说当你使用{$exists:false}的时候,是不会走索引的,是全集合扫描。
db.test_new_wildidx.find({“block.attr”:{$exists:false}})
db.test_new_wildidx.find({“block.attr”:{$exists:true}}) 但是支持true的。
2.通配符索引不支持直接等于/不等于一个对象或者数组。
通配符索引会将对象或者数组中的元素加载到索引中,而不是整体放到索引中。故通配符索引不支持直接用文档或者数组来匹配。
所以上面的例子如果
5、总结通配符索引在一定程度上可以应对在建模初期对于索引建立疏忽的遗漏,但是如果一味依赖通配符索引来解决查询中的各种精确字段的匹配那就是郑人买履了,在实际测试中通配符索引和精确字段的索引相比随着数据的增长效率逐渐下滑。这也是官方不是很建议使用通配符索引来替代常规索引的原因。
到此这篇关于MongoDB通配符索引的文章就介绍到这了,更多相关MongoDB通配符索引内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!