技术干货 | MongoDB 功能详解之通配符索引的限制(Wildcard Index Restrictions)
通配符索引(Wildcard Indexes):MongoDB 4.2 版本中的新功能。
上一篇重点介绍了通配符索引的创建、特性以及注意事项,本篇则是通配符索引的限制,可以视作上一篇内容的附录补充。
不兼容的索引类型或属性
通配符索引不支持下列索引类型或属性:
- 复合型(Compound)
- TTL(TTL)
- 文本型(Text)
- 2d (Geospatial)(2d (Geospatial))
- 2dsphere (Geospatial)(2dsphere (Geospatial))
- 散列型(Hashed)
- 唯一型(Unique)
📒 注意:
通配符索引与通配符文本索引是不同的,也是不兼容的。通配符索引不能支持使用 $text 操作符的查询。
不支持的查询和聚合模式
字段不存在
通配符索引是稀疏的,不对空字段进行索引。因此,通配符索引不能支持查询某个字段不存在的文档。
例如,考虑到集合中字段 product_attributes 值不存在,则不能支持通配符索引的查询方式。
db.inventory.find( {"product_attributes" : { $exists : false } } )
db.inventory.aggregate([
{ $match : { "product_attributes" : { $exists : false } } }
])
字段等于一个文档或数组
通配符索引为文档或数组的内容生成条目,而不是文档或数组本身。因此通配符索引不支持精确的文档或数组的等式查询。通配符索引支持查询字段等于空文档 {} 的情况。
例如,通配符索引不能支持以下集合的查询条件:
db.inventory.find({ "product_attributes" : { "price" : 29.99 } } )
db.inventory.find({ "product_attributes.tags" : [ "waterproof", "fireproof" ] } )
db.inventory.aggregate([{
$match : { "product_attributes" : { "price" : 29.99 } }
}])
db.inventory.aggregate([{
$match : { "product_attributes.tags" : ["waterproof", "fireproof" ] } }
}])
字段不等于一个文档或数组
通配符索引为文档或数组的内容生成条目,而不是文档或数组本身。因此,通配符索引不能支持精确的文档或数组不等式查询。
例如,通配符索引不能支持以下集合的查询条件:
db.inventory.find( { $ne : [ "product_attributes", { "price" : 29.99 } ] } )
db.inventory.find( { $ne : [ "product_attributes.tags", [ "waterproof", "fireproof" ] ] } )
db.inventory.aggregate([{
$match : { $ne : [ "product_attributes", { "price" : 29.99 } ] }
}])
db.inventory.aggregate([{
$match : { $ne : [ "product_attributes.tags", [ "waterproof", "fireproof" ] ] }
}])
字段值不等于 null
在集合中的任何文档中的任意数组内选中某个字段对应的值,如果值为 null 则不能使用通配符索引查询。
例如,通配符索引不能支持以下集合的查询条件:
db.inventory.find( { $ne : [ "product_attributes.tags", null ] } )
db.inventory.aggregate([{
$match : { $ne : [ "product_attributes.tags", null ] }
}])
分片
你不能使用通配符索引来给一个集合做分片。可以在你想要分片的字段上创建一个非通配符索引。关于 Shard Keys 的更多信息,参见片键(Shard Keys)文档。
原文:Wildcard Index Restrictions
关于译者:
刘东方,MongoDB 中文社区成员,现就职于中国联通软件研究院,目前专注于 MongoDB 数据库运维与技术支持。
文章转载自公众号: Mongoing中文社区