MongoDB—索引
<h1 id="index">Index</h1><h2 id="定义">定义</h2>
<p>索引,一个单独的、存储在磁盘上的数据结构</p>
<blockquote>
<p>mongodb 的索引采用 B-tree 数据结构存储</p>
</blockquote>
<ul>
<li>
<p>易于遍历,支持相等匹配和范围查询</p>
</li>
<li>
<p>存储字段的值以及指向其所在文档的指针</p>
<blockquote>
<p>包含集合中所有文档的指针(包含数据表中所有记录的引用指针)</p>
</blockquote>
</li>
<li>
<p>按字段的值排序</p>
</li>
</ul>
<h2 id="mongodb-index">mongodb index</h2>
<ul>
<li>在集合级别定义索引,支持在文档中的任何字段或子字段上建立索引</li>
<li>给某个字段添加索引,可以快速找出在该字段有特定值的文档,提高查询速度</li>
<li>如果没有索引,mongodb必须扫描集合中所有的文档,以选择那些符合查询条件的文档。一般而言,在查询文档时应避免扫描全部文档,这样会使查询速度非常慢</li>
<li>建立索引可以缩小mongodb扫描文档的数量,提高查询速度</li>
<li>mongodb 可以返回基于索引排序的查询结果</li>
</ul>
<p>演示基于索引查询并排序</p>
<p><img src="https://img2020.cnblogs.com/blog/1418536/202008/1418536-20200828123949057-1727294036.png" alt="" loading="lazy"></p>
<h3 id="_id">_id</h3>
<ul>
<li>mongodb 默认会为文档创建一个<code>_id</code> 字段,并建立唯一索引</li>
<li>不能删除建立在<code>_id</code>字段上的索引</li>
<li>索引名称为 <code>_id_</code></li>
</ul>
<h2 id="创建索引">创建索引</h2>
<h3 id="dbcollectioncreateindex">db.collection.createIndex</h3>
<ul>
<li>
<p>为集合创建索引</p>
</li>
<li>
<p>如果索引(名称)已经存在,则不会再次创建</p>
</li>
<li>
<p>除 collation 选项外,使用 不同的选项 不会创建 具有相同索引规范的 索引,也不会修改这些选项的值</p>
<blockquote>
<p>只能删除之前的索引,重新使用新的选项创建</p>
</blockquote>
</li>
<li>
<p>使用不同的 collation 选项,可以创建 多个 具有相同的索引规范的 索引,但是需要指定 唯一的 索引名称</p>
<pre><code class="language-sql">db.person.createIndex({name:1},{name:"a_c", collation:{locale:"fr"}})
db.person.createIndex({name:1},{name:"a_b", collation:{locale:"fa"}})
</code></pre>
</li>
<li>
<p>如果文档不包含指定的字段,则操作失败</p>
</li>
</ul>
<p><strong>格式</strong></p>
<pre><code>db.collection.createIndex(keys, options)
</code></pre>
<ul>
<li>
<p>keys</p>
<ul>
<li>类型:Document</li>
<li>描述:
<ul>
<li>
<p>包含字段和值的文档,其中字段是索引键,值是该字段的索引类型</p>
<blockquote>
<p>判断索引是否相同根据索引的 keys,因此 keys 不同就代表索引不同</p>
<ul>
<li>
<p>用下划线连接组成默认索引名称</p>
</li>
<li>
<p>同一个字段上只能创建一个相同类型的索引,可以创建多个不同类型的索引</p>
<p>例如 {age:1} {age:-1} 两个keys不同,索引(名)不同</p>
</li>
</ul>
</blockquote>
</li>
<li>
<p>索引类型包括:test、geospatial、hashed、ascending、descending</p>
<blockquote>
<p>排序规则</p>
<ul>
<li>值为 1,表示升序(ascending)</li>
<li>值为 -1,表示降序(descending)</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>options</p>
<ul>
<li>
<p>类型:Document</p>
</li>
<li>
<p>描述:创建索引的选项,不同类型的索引有特定于该类型的选项,以下为共有选项</p>
<ul>
<li>
<p>background</p>
<ul>
<li>
<p>类型:布尔【4.2版本中被废弃】</p>
</li>
<li>
<p>描述:是否在后台执行创建索引的过程,不阻塞对集合的操作</p>
<ul>
<li>
<p>false【默认】</p>
<p>不在后台创建</p>
</li>
<li>
<p>true</p>
<p>后台创建</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<ul>
<li>
<p>4.2 版本中所有的索引构建,使用一个优化的构建过程,它只在构建过程的开始和结束时持有独占锁,构建过程中让步于读写操作</p>
<p>4.2 版本会忽略该选项</p>
</li>
<li>
<p>4.2 版本之前索引的构建的整个过程都会持有独占锁,阻塞数据库及其所有集合上的操作,直到操作完成,在后台创建索引不会持有独占锁</p>
</li>
</ul>
</blockquote>
</li>
<li>
<p>unique</p>
<ul>
<li>
<p>类型:布尔</p>
</li>
<li>
<p>描述:</p>
<ul>
<li>
<p>是否创建具有唯一性的索引</p>
<ul>
<li>
<p>true</p>
<p>此索引具有唯一性,当索引重复时,不接受对文档的插入或更新</p>
</li>
<li>
<p>false【默认】</p>
</li>
</ul>
</li>
<li>
<p>不适用于 hashed 索引</p>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>name</p>
<ul>
<li>
<p>类型:字符串</p>
</li>
<li>
<p>描述</p>
<ul>
<li>
<p>自定义索引名称</p>
</li>
<li>
<p>如果不指定,mongodb将通过 下划线 连接 索引字段的名称和排序规则 生成一个索引名称</p>
<blockquote>
<p>例如在 { item : 1, quantity: -1 } 上创建的索引名称为 item_1_quantity_-1</p>
</blockquote>
</li>
<li>
<p>一旦创建不能修改,只能删除再重新创建</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>4.2 版本之前,索引名最大长度为 127 字节,4.2版本开始取消该限制</p>
</blockquote>
</li>
<li>
<p>partialFilterExpression</p>
<ul>
<li>
<p>类型:Document</p>
</li>
<li>
<p>描述:仅为集合中<strong>符合条件</strong>的文档建立索引,降低创建和维护成本</p>
</li>
</ul>
</li>
<li>
<p>sparse</p>
<blockquote>
<p>稀疏</p>
</blockquote>
<ul>
<li>
<p>类型:布尔</p>
</li>
<li>
<p>描述:仅为集合中<strong>具有指定字段</strong>的文档建立索引</p>
<ul>
<li>
<p>true</p>
<p>建立稀疏索引</p>
</li>
<li>
<p>false 【默认】</p>
</li>
</ul>
<blockquote>
<p>zdsphere、2d、geoHaystack、text 默认为稀疏文档,忽略此选项</p>
</blockquote>
</li>
</ul>
</li>
<li>
<p>expireAfterSeconds</p>
<ul>
<li>类型:integer,单位 秒</li>
<li>描述:用于 TTL 索引中 控制 文档保存在集合中的时间</li>
</ul>
</li>
<li>
<p>storageEngine</p>
<ul>
<li>类型:Document</li>
<li>描述:指定存储引擎配置</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>Returns</strong></p>
<ul>
<li>
<p>成功</p>
<pre><code>{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4,
"ok" : 1
}
</code></pre>
<ul>
<li>createdCollectionAutomatically 是否自动创建集合</li>
<li>numIndexesBefore 创建之前索引个数</li>
<li>numIndexesAfter 创建之后索引个数</li>
<li>ok:1 创建成功</li>
</ul>
</li>
<li>
<p>失败</p>
<pre><code>{
"ok" : 0,
"errmsg" : "Error: hashed indexes do not currently support array values",
"code" : 16766,
"codeName" : "Location16766"
}
</code></pre>
<ul>
<li>ok:0 创建失败</li>
<li>errmsg 失败信息</li>
<li>code 失败码</li>
<li>codeName ?</li>
</ul>
</li>
</ul>
<h2 id="查询索引">查询索引</h2>
<h3 id="dbcollectiongetindexes">db.collection.getIndexes</h3>
<ul>
<li>
<p>查询集合中所有的索引信息</p>
</li>
<li>
<p>返回一个数组,数组元素是描述索引信息的文档</p>
<blockquote>
<p>索引信息包括创建索引时的信息:keys 以及 options</p>
</blockquote>
</li>
</ul>
<p><strong>格式</strong></p>
<pre><code>db.collection.getIndexes()
</code></pre>
<h3 id="dbcollectiontotalindexsize">db.collection.totalIndexSize</h3>
<ul>
<li>查询集合中所有索引的大小</li>
<li>如果索引使用前缀压缩 (这是WiredTiger的默认值),则返回压缩后的大小</li>
<li>单位 字节 byte</li>
</ul>
<p><strong>格式</strong></p>
<pre><code>db.collection.totalIndexSize()
</code></pre>
<h2 id="删除索引">删除索引</h2>
<h3 id="dbcollectiondropindex">db.collection.dropIndex</h3>
<ul>
<li>删除指定索引</li>
<li>不能删除默认创建在<code> _id</code> 字段上的索引</li>
</ul>
<p><strong>格式</strong></p>
<pre><code>db.collection.dropIndex(index)
</code></pre>
<ul>
<li>
<p>index</p>
<ul>
<li>
<p>类型:字符串、文档</p>
</li>
<li>
<p>描述:指定要删除的索引</p>
<ul>
<li>
<p>可以指定索引的名称 或 索引规范文档</p>
<blockquote>
<p>通过 <code>db.collection.getIndexes()</code> 获取索引名称</p>
</blockquote>
</li>
<li>
<p>删除 text 类型的索引,必须指定索引名称</p>
<blockquote>
<p>无法通过索引规范文档找到索引,删除失败</p>
</blockquote>
</li>
<li>
<p>4.2 版本开始,不能通过<code>db.collection.dropIndex("*") </code> 删除所有非 <code>_id</code> 字段上的索引,应该使用<code>db.collection.dropIndexes()</code></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>排它锁</strong></p>
<ul>
<li>4.2 版本之前,dropIndex 操作在父级<strong>数据库上</strong>获取一个排它锁,阻塞所有对数据库及其所有集合的操作,直到操作完成</li>
<li>4.2 版本之后,dropIndex 操作在指定<strong>集合上</strong>获取一个排它锁,阻塞对集合的所有后续操作</li>
</ul>
<p><strong>示例</strong></p>
<ul>
<li>
<p>通过索引名称删除</p>
<pre><code>db.pets.dropIndex( "cat_-1" )
</code></pre>
</li>
<li>
<p>通过索引规范文档删除</p>
<pre><code>db.pets.dropIndex( { "cat" : -1 } )
</code></pre>
</li>
</ul>
<h3 id="decollectiondropindexes">de.collection.dropIndexes</h3>
<ul>
<li>删除单个或多个索引</li>
<li>不能删除默认创建在<code> _id</code> 字段上的索引</li>
</ul>
<p><strong>格式</strong></p>
<pre><code>db.collection.dropIndex(indexes)
</code></pre>
<ul>
<li>
<p>indexes</p>
<ul>
<li>
<p>类型:字符串、文档、字符串数组</p>
</li>
<li>
<p>描述:需要删除的索引</p>
<ul>
<li>
<p>删除<code>_id</code> 之外的所有索引,忽略该参数</p>
</li>
<li>
<p>删除单个索引,指定索引的名称或索引规范文档,text 类型的索引只能指定名称</p>
</li>
<li>
<p>删除多个索引,通过数组指定索引的名称</p>
<blockquote>
<p>如果数组中包含不存在的索引,则不删除任何索引,操作报错</p>
<p>4.2 新增</p>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>排它锁</strong></p>
<ul>
<li>4.2 版本之前,dropIndex 操作在父级数据库上获取一个排它锁,阻塞所有对数据库及其所有集合的操作,直到操作完成</li>
<li>4.2 版本之后,dropIndex 操作在指定集合上获取一个排它锁,阻塞对集合的所有后续操作</li>
</ul>
<p><strong>示例</strong></p>
<ul>
<li>
<p>删除<code>_id</code>之外的所有索引</p>
<pre><code>db.collection.dropIndexes()
</code></pre>
</li>
<li>
<p>删除单个索引</p>
<pre><code>db.collection.dropIndexes( { a: 1, b: 1 } )
db.collection.dropIndexes( "a_1_b_1" )
</code></pre>
</li>
<li>
<p>删除多个索引</p>
<pre><code>db.collection.dropIndexes( [ "a_1_b_1", "a_1", "a_1__id_-1" ] )
</code></pre>
</li>
</ul>
<h2 id="索引类型">索引类型</h2>
<h3 id="single-field-索引">Single Field 索引</h3>
<ul>
<li>单字段索引</li>
<li>对于单字段索引,升序降序并不重要,因为mongodb可以按任意方向遍历索引</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/1418536/202008/1418536-20200828124032645-1764589807.png" alt="" loading="lazy"></p>
<p><strong>示例</strong></p>
<pre><code>db.collection.createIndex( { orderDate: 1 } )
</code></pre>
<ul>
<li>在 orderDate 字段上创建一个升序索引</li>
<li>默认名称<code>orderDate_1</code></li>
</ul>
<h3 id="compound-索引">Compound 索引</h3>
<ul>
<li>
<p>复合索引</p>
</li>
<li>
<p>将多个字段组合成一个索引</p>
</li>
<li>
<p>创建复合索引时,字段的顺序非常重要</p>
</li>
<li>
<p>整体上按第一个字段进行排序,对于按第一个字段排序并列的索引,再使用第二个字段进行排序</p>
</li>
<li>
<p>查询条件中必须包含索引的前缀字段</p>
<blockquote>
<p>例如以3个字段组成的索引,查询条件中需包含第一个字段 或 第一个及第二个字段 或 全部三个字段</p>
</blockquote>
</li>
<li>
<p>复合索引中不能包含 hashed 索引</p>
</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/1418536/202008/1418536-20200828124050084-1080043920.png" alt="" loading="lazy"></p>
<p><strong>示例</strong></p>
<pre><code>db.collection.createIndex( { orderDate: 1, zipcode: -1 } )
</code></pre>
<ul>
<li>创建一个在 orderDate 字段进行升序排列,在 zipcode 字段进行降序排列的复合索引</li>
</ul>
<h3 id="multikey-索引">Multikey 索引</h3>
<ul>
<li>多键索引</li>
<li>使用点表示法,对嵌套数组中的字段建立索引</li>
<li>mongodb会为数组中的每个元素创建单独的 索引项</li>
<li>允许查询条件匹配数组的一个或多个元素来选择符合条件的文档</li>
<li>如果索引字段包含数组元素,mongodb会自动创建一个多键索引</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/1418536/202008/1418536-20200828124106843-476240388.png" alt="" loading="lazy"></p>
<h3 id="geospatial-索引">Geospatial 索引</h3>
<ul>
<li>地理空间索引</li>
</ul>
<h3 id="text-索引">Text 索引</h3>
<ul>
<li>文本索引:对字符串内容进行查询</li>
<li>一般在 字符串类型字段 或 <strong>字符串数组</strong>类型字段 上创建文本索引</li>
<li>使用文本索引查找时,不区分字母大小写</li>
<li>目前不支持中文文本索引,支持英语、法语、德语、俄语、西班牙语、土耳其语</li>
<li>文本索引具有 sparse 属性,忽略创建过程中的 sparse 选项</li>
<li>文本索引支持 <code>$text</code> 查询操作</li>
<li>限制
<ul>
<li>一个集合最多只能创建一个文档索引</li>
<li>排序操作 sort,不能使用文本索引中的排序</li>
<li>复合文本索引中,如果在文本索引键之前包含其他键,则通过 $text 搜索时,查询谓词必须包含前面键的相等匹配条件</li>
<li>只能通过索引名称删除文本索引</li>
</ul>
</li>
</ul>
<p><strong>格式</strong></p>
<pre><code>db.collection.createIndex(
keys ,
options
)
</code></pre>
<ul>
<li>
<p>keys</p>
<ul>
<li>
<p>类型:Document</p>
</li>
<li>
<p>描述:text 类型的索引规范文档</p>
<ul>
<li>
<p>单字段</p>
<pre><code>{ field1: "text"}
</code></pre>
</li>
<li>
<p>多字段</p>
<pre><code>{
field1: "text",
field2: "text",
...
}
// 复合索引
{
field1: 1,
field2: "text",
...
}
</code></pre>
</li>
<li>
<p>全部字段</p>
<p>用 <code>$**</code> 代表文档中的所有字符串类型的字段</p>
<pre><code>{ "$**": "text" }
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>options</p>
<ul>
<li>weights
<ul>
<li>类型:Document</li>
<li>描述:
<ul>
<li>包含字段和权重的文档,指定字段的权重,默认值为1,可设定为 1-99999 之间的整数</li>
<li>优先查询权重大的字段,次之查询权重小的字段</li>
</ul>
</li>
</ul>
</li>
<li>default_language
<ul>
<li>类型:字符串</li>
<li>描述
<ul>
<li>对于文本索引,不同的语言有不同的分析规则</li>
<li>默认值为 <code>english</code></li>
</ul>
</li>
</ul>
</li>
<li>language_override
<ul>
<li>类型:字符串</li>
<li>描述
<ul>
<li>For text indexes, the name of the field, in the collection’s documents, that contains the override language for the document</li>
<li>默认值为<code>language</code></li>
</ul>
</li>
</ul>
</li>
<li>textIndexVersion
<ul>
<li>类型:integer</li>
<li>描述:指定文本索引的版本</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>示例</strong></p>
<ul>
<li>
<p>创建文本索引</p>
<pre><code>db.reviews.createIndex( { comments: "text" } )
db.reviews.createIndex(
{
subject: "text",
comments: "text"
}
)
db.reviews.createIndex( { "$**": "text" } )
</code></pre>
</li>
<li>
<p>指定不同的权重</p>
<pre><code> db.reviews.createIndex(
{ "$**": "text" } ,
{ weights : {subject: 10, comments: 5}}
)
</code></pre>
<ul>
<li>索引名<code>$**_text</code></li>
</ul>
</li>
</ul>
<h3 id="hashed-索引">Hashed 索引</h3>
<ul>
<li>
<p>哈希索引:使用字段值的哈希值来创建索引</p>
</li>
<li>
<p>主要用在分片的片键上</p>
</li>
<li>
<p>支持 非数组 单字段 索引,不支持多字段索引</p>
<blockquote>
<p>多字段索引报错</p>
<pre><code>db.articles.createIndex({subject:"hashed",author:"hashed"})
</code></pre>
<ul>
<li>"errmsg" : "Currently only single field hashed index supported."</li>
</ul>
<p>数组字段索引报错</p>
<pre><code>db.articles.createIndex({arr:"hashed"})
</code></pre>
<ul>
<li>
<p>"errmsg" : "Error: hashed indexes do not currently support array values",</p>
</li>
<li>
<p>creating a hashed index on a field that contains an array <em>or</em> attempting to insert an array into a hashed indexed field returns an error.</p>
</li>
</ul>
</blockquote>
</li>
<li>
<p>不能设定唯一性约束,因为存在hash碰撞</p>
<blockquote>
<pre><code>db.articles.createIndex({subject:"hashed"},{unique:true})
</code></pre>
<ul>
<li>"errmsg" : "Currently hashed indexes cannot guarantee uniqueness. Use a regular index."</li>
</ul>
</blockquote>
</li>
<li>
<p>创建哈希索引的字段,也可以同时创建其他索引</p>
<blockquote>
<p>不支持创建复合索引,但是同一个字段可以创建多个不同类型的索引</p>
<pre><code class="language-sql">db.articles.createIndex({subject:"hashed"})
db.articles.createIndex({subject:"hashed",subject:"text"}) // 只会创建一个文本索引
db.articles.createIndex({subject:"hashed",subject:1}) // 只会创建一个升序索引
// 最终在 subject 字段上创建了3个不同类型的索引
</code></pre>
</blockquote>
</li>
<li>
<p>哈希索引支持相等查询,不支持范围查询</p>
</li>
<li>
<p>在使用哈希索引查询时,mongodb 会自动计算,无需单独计算</p>
<blockquote>
<p>4.0 版本开始,mongodb提供了 <code>convertShardKeyToHashed()</code> 方法,该方法使用相同的哈希计算方法,可用于查看键的哈希值</p>
</blockquote>
</li>
<li>
<p>类型为浮点数的字段不能创建哈希索引</p>
<blockquote>
<p>mongodb 哈希索引在计算之前会将浮点数截断为64位的整数,例如 2.3、 2.2、 2.9 都被截断为2进行计算</p>
</blockquote>
</li>
</ul>
<p><strong>格式</strong></p>
<pre><code>db.collection.createIndex( { field: "hashed" } )
</code></pre>
<h2 id="索引属性">索引属性</h2>
<h3 id="unique-索引">Unique 索引</h3>
<ul>
<li>唯一性</li>
</ul>
<h3 id="partial-索引">Partial 索引</h3>
<ul>
<li>局部性</li>
</ul>
<h3 id="sparse-索引">Sparse 索引</h3>
<ul>
<li>稀疏性</li>
</ul>
<h3 id="ttl-索引">TTL 索引</h3>
<ul>
<li>
<p>生命周期性(文档在一段时间后会被mongodb自动删除)</p>
</li>
<li>
<p>一般在 Date类型的字段 或 包含Date类型元素的数组字段 上创建TTL索引,其他字段无效</p>
</li>
<li>
<p>过期阈值的计算</p>
<ul>
<li>如果字段类型是 Date,则过期阈值是字段值日期加上指定的过期时间</li>
<li>如果字段类型是包含 Date 类型元素的数组,则过期阈值是元素中最早的日期加上指定的过期时间</li>
<li>如果非以上两种类型,TTL 索引无效,文档不会过期</li>
</ul>
</li>
<li>
<p>将 <code>expireAfterSeconds</code> 设置为0,则过期时间就是日期字段的值</p>
</li>
<li>
<p>TTL 线程</p>
<ul>
<li>mongod 中的后台线程,每隔<strong>60秒</strong>运行一次,用来读取索引中的值并从集合中删除过期的文档</li>
<li>不保证文档过期后立即被删除,文档过期的时间和从数据库中删除的时间存在延迟(60s)</li>
<li>当 TTL 线程处于活动状态时,可以在 <code>db.currentOp()</code> 的输出中看到删除操作</li>
</ul>
</li>
<li>
<p>限制</p>
<ul>
<li>
<p>不能在 <code>_id</code> 字段上建立 TTL 索引</p>
</li>
<li>
<p>不能通过改变 options 将非 TTL 索引变为 TTL 索引</p>
</li>
<li>
<p>不能在固定集合中建立 TTL 索引,因为mongodb不能从固定集合中删除文档</p>
</li>
<li>
<p>不能是复合索引,只能是<strong>单字段索引</strong></p>
</li>
</ul>
</li>
</ul>
<p><strong>格式</strong></p>
<pre><code class="language-sql">db.collection.createIndex(
<keys>,
{
expireAfterSeconds: <integer>
}
)
</code></pre>
<p><strong>示例</strong></p>
<p>文档</p>
<pre><code>db.ttl.insertMany([
{date:new Date("2020-08-13T17:50:00"), money:1},
{date:new Date("2020-08-13T17:52:00"), money:2},
{date:new Date("2020-08-13T17:54:00"), money:3},
])
</code></pre>
<pre><code>db.ttl.createIndex({date:-1})
db.ttl.createIndex({date:1, money:-1})
db.ttl.createIndex({date:1},{expireAfterSeconds:10})
</code></pre>
<ul>
<li>在 ttl 集合中的 date 字段上创建3个索引</li>
<li>有一个 TTL 索引,过期阈值为:date 日期加上指定过期时间</li>
<li>结果是,到过期阈值时,文档被依次删除</li>
</ul>
<h4 id="修改过期时间">修改过期时间</h4>
<pre><code class="language-sql">db.runCommand({
collMod: <collection>,
index:{
keyPattern: <keys>,
expireAfterSeconds: <integer>
}
})
</code></pre>
<p><strong>示例</strong></p>
<pre><code>db.ttl.insertMany([
{date:new Date("2020-08-13T18:08:00"), money:1},
{date:new Date("2020-08-13T18:09:00"), money:2},
{date:new Date("2020-08-13T18:10:00"), money:3},
])
</code></pre>
<pre><code class="language-sql">db.runCommand({
collMod:"ttl",
index:{
keyPattern:{date:1},
expireAfterSeconds:60*60
}
})
</code></pre>
<p>返回结果</p>
<pre><code>{ "expireAfterSeconds_old" : 10, "expireAfterSeconds_new" : 3600, "ok" : 1 }
</code></pre>
<h3 id="hidden-索引">Hidden 索引</h3>
<blockquote>
<p>4.4 新增</p>
</blockquote>
<ul>
<li>对查询规划器不可见,不能用于查询</li>
<li>用来评估删除索引的潜在影响,而不必实际删除该索引。如果影响是负面的,用户可以取消隐藏索引,而不必重新创建</li>
<li>索引在隐藏时也会被维护,因此一旦不隐藏,就可以立即使用这些索引</li>
</ul><br><br>
来源:https://www.cnblogs.com/usmile/p/13576813.html
頁:
[1]