学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第99篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。威赞文章都是结合官方文档,翻译整理而来,并对每个知识点的描述都认真思考和实践,对难以理解的地方,使用简单容易理解的方式进行阐述。
通配符索引为Mongodb灵活的数据结构,提供了高效查询的解决方案。但Mongodb文档中明确的提出来,通配符索引和通配符文本索引,是两个完全不同的索引。那通配符文本索引到底是什么样的方式来运作,本文继续研究官方文档,来归纳总结通配符文本索引的介绍和用法。
概述
用户可以为集合中多个文本字段创建一个文本索引。这种集合多个字段的索引,就是通配符文本索引。通配符文本索引支持未知字段,可变字段和动态生成字段的文本查询。
使用通配标识符$**和索引类型text来构建通配符文本索引。
db.<collection>.createIndex({"$**": "text"})
通配符索引和通配符文本索引,是不同的索引。通配符文本索引支持使用$text操作符的查询, 而通配符索引不支持使用该操作符查询。
当用户在集合中添加通配符文本索引后,向集合中插入数据或者数据更新时,在通配符文本索引中的数据都会更新。因此,通配符文本索引对数据插入和更新有负面的影响。Mongodb建议,仅在字段不确定或未来字段可能发生变化时,使用通配符文本索引。通配符文本索引于其他索引的工作方式不一致。当集合中包含了过多随意的字段导致创建索引困难时,要考虑重新定义数据的结构。
应用
创建blog集合并插入数据
db.blog.insertMany([
{
"_id": 1,
"content": "This is a blog post about MongoDB",
"about": "MongoDB",
"keywords": [
"MongoDB",
"database",
"NoSQL"
]
},
{
"_id": 2,
"content": "This is a blog post about MongoDB and Python",
"about": "MongoDB",
"keywords": [
"MongoDB",
"Python"
]
},
{
"_id": 3,
"content": "This is a blog post about NoSQL databases",
"about": "NoSQL",
"keywords": [
"NoSQL",
"database"
]
}
])
构建通配符文本索引
db.blog.createIndex({"$**": "text"})
使用通配符索引查询
db.blog.find({$text: {$search: "MongoDB"}})
查看执行计划
匹配多个字符串
db.blog.find({$text: {$search: "MongoDB NoSQL"}})