点击下方公众号关注并分享获取 MongoDB 最新资讯
隐藏索引(Hidden Indexes):版本 4.4 中的新功能。
行为
除了对查询分析器隐藏之外,隐藏索引的行为与非隐藏索引类似,例如:
如果隐藏索引是唯一索引(unique index),索引仍将其唯一约束性应用于文档;
如果隐藏索引是过期索引(TTL index),索引仍将使文档过期;
隐藏索引仍然包含在
和
db.collection.getIndexes()
的结果中;隐藏索引在对集合执行写入操作时更新,并仍然消耗磁盘空间和内存。因此,仍然包含在各种统计操作中,例如
db.collection.stats()
和$indexStats
;隐藏一个未被隐藏的索引和取消隐藏一个已经隐藏的索引会重置其
$indexStats
。隐藏一个已经被隐藏的索引和取消一个未被隐藏的索引不会重置$indexStats
。
约束
要使用隐藏索引,必须将功能兼容版本(featureCompatibilityVersion)设置为 4.4 或以上版本。但一旦隐藏了索引,在 MongoDB 4.4 二进制包的情况下,即使将功能兼容版本(featureCompatibilityVersion)设置为 4.2,该索引仍然是隐藏的。
不能隐藏 _id 索引。 不能对隐藏索引使用
cursor.hint()
。
示例
创建隐藏索引
使用 db.collection.createIndex()
并将 hidden 选项设为 true 。
使用 db.collection.createIndex()
的 hidden 选项,必须将功能兼容版本(featureCompatibilityVersion)设置为 4.4 或以上版本。但一旦隐藏了索引,在 MongoDB 4.4 二进制包的情况下,即使将功能兼容版本(featureCompatibilityVersion)设置为 4.2,该索引仍然是隐藏的。
例如,下面的操作就是在 borough 字段创建一个正序的隐藏索引:
db.addresses.createIndex(
{ borough: 1 },
{ hidden: true }
);
db.collection.getIndexes()操作:
db.addresses.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"borough" : 1
},
"name" : "borough_1",
"hidden" : true
}
]
⚠️ 注意:
要使用隐藏索引,必须将功能兼容版本(featureCompatibilityVersion)设置为 4.4 或以上版本。但一旦隐藏了索引,在 MongoDB 4.4 二进制包的情况下,即使将功能兼容版本(featureCompatibilityVersion)设置为 4.2,该索引仍然是隐藏的。
不能隐藏 _id 索引。
collMod命令或
mongosh执行
db.collection.hideIndex()。
db.restaurants.createIndex( { borough: 1, ratings: 1 } );
使用索引的键执行 db.collection.hideIndex()
方法:
db.restaurants.hideIndex( { borough: 1, ratings: 1 } ); // 指定索引的键
使用索引的名字,执行 db.collection.hideIndex()
方法:
db.restaurants.hideIndex( "borough_1_ratings_1" ); // 指定索引名称
db.collection.getIndexes()操作:
db.restaurants.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"borough" : 1,
"ratings" : 1
},
"name" : "borough_1_ratings_1",
"hidden" : true
}
]
collMod命令或
mongosh执行
db.collection.unhideIndex()。可以使用以下任意方法:
使用索引的键,执行 db.collection.unhideIndex()
:
db.restaurants.unhideIndex( { borough: 1, city: 1 } ); // 指定索引的键
使用索引的名字,执行
db.collection.unhideIndex()
:
db.restaurants.unhideIndex( "borough_1_ratings_1" ); // 指定索引名称
db.collection.getIndexes():
db.restaurants.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"borough" : 1,
"ratings" : 1
},
"name" : "borough_1_ratings_1"
}
]
borough_1_ratings_1索引上,因为 hidden 选项只在值为 true 的时候才会返回。
关于译者:
【推荐阅读】
干货教程 | MongoDB 熟练到精通(五):文档模型设计三步曲之模式套用 干货教程 | MongoDB 熟练到精通(四):文档模型设计三步曲之工况细化篇 干货教程 | MongoDB 熟练到精通(三): 文档模型设计三步曲之基础建模篇
社区招募
为了让社区组委会成员和志愿者朋友们灵活参与,同时我们为想要深度参与社区建设的伙伴们开设了“招募通道”,如果您想要在社区里面结交志同道合的技术伙伴,想要通过在社区沉淀有价值的干货内容,想要一个展示自己的舞台,提升自身的技术影响力,即刻加入社区贡献队伍~ 点击提交申请 社区合作
接下来我们会在诸多城市举办技术大会,如果您有优质的议题和 MongoDB 相关经验的嘉宾可以与我们分享,或者有赞助合作意向的小伙伴,包含但不限制于联合主办方、媒体合作等,都可以随时联系我们的社区助手小芒果(微信ID:mongoingcom)沟通具体事宜。 重要资讯
感谢大家一直以来对社区的关注与支持!社区在大家共同的努力下不断发展与壮大,为了给大家营造更便捷的交流环境,QQ 技术交流群将同步在“微信技术交流群”中。扫描下方二维码添加小芒果微信发送“mongo”即可进入技术交流群。
获取更多精彩内容点击社区网站www.mongoing.com
扫描上方二维码添加小芒果微信
(ID:mongoingcom)
进入中文用户组技术交流群
长按二维码加入我们






