> use testDB
> db.testColl.findOne()
{
"_id" : ObjectId("643dfcfbf23397002ed07402"),
"msg" : "2023-04-18 10:14:19.929 | INFO | __main__:get_scenic_comment:116 - 你好,test,第59页数据成功!",
"task_id" : "4e0a485a-d7a8-4147-bade-6e1109838ae8",
"seq" : NumberLong(4310),
"ts" : ISODate("2023-04-18T02:14:19.929Z"),
"expire_ts" : ISODate("2023-04-19T02:14:19.929Z")
}
> db. testColl.getIndexes()
[
{
"v" : 2,
"key" : {
"expire_ts" : 1
},
"name" : "expire_ts_1",
"sparse" : true,
"expireAfterSeconds" : 1
}
]
这是一个MongoDB的索引,使用了TTL(Time To Live)功能,即过期自动删除功能。
具体解释如下:
-
"v" : 2:表示该索引是MongoDB的第二个版本,即使用了新的索引存储引擎。
-
"key" : {"expire_ts" : 1}:表示该索引是基于expire_ts字段创建的,1表示按照升序排序。
-
"name" : "expire_ts_1":表示该索引的名称,命名规则是字段名_排序方式。
-
"sparse" : true:表示该索引是稀疏索引,即只包含具有非空expire_ts字段的文档。
-
"expireAfterSeconds" : 1:表示该索引启用了TTL功能,即该索引会自动删除expire_ts字段值小于当前时间的文档,过期时间为1秒。
综上,该索引是一个基于expire_ts字段的稀疏索引,启用了TTL功能,每隔1秒自动删除expire_ts字段值小于当前时间的文档。
该索引适用于需要自动删除过期数据的场景,比如日志、缓存等。
如何理解MongoDB的稀疏索引?
MongoDB的稀疏索引是一种特殊类型的索引,它只包含具有非空索引字段的文档。如果一个文档缺少索引字段,则该文档不会被添加到稀疏索引中。这种索引通常用于处理稀疏数据集,其中大多数文档缺少某些字段。
稀疏索引可以提高查询性能并减少索引的存储空间。如果数据集中大多数文档缺少某些字段,那么创建一个密集的索引可能会浪费大量的存储空间。稀疏索引只包含具有非空索引字段的文档,因此可以显著减少索引的存储空间。
另外,稀疏索引也可以提高查询性能。如果一个查询需要检索一个缺少索引字段的文档,那么在一个密集的索引中需要扫描所有的文档。而在一个稀疏索引中,只需要扫描具有非空索引字段的文档,因此查询速度更快。
假设有一个存储用户信息的集合,其中大多数用户没有填写电话号码。如果需要查询所有拥有电话号码的用户,可以为电话号码字段创建稀疏索引。
以下是示例代码:
创建稀疏索引:
db.users.createIndex( { phone: 1 }, { sparse: true } )
向集合中添加文档:
db.users.insertMany([
{ name: "Alice", phone: "123-456-7890" },
{ name: "Bob", email: "bob@example.com" },
{ name: "Charlie", phone: "555-555-5555" },
{ name: "Dave", phone: "987-654-3210" },
{ name: "Eve", email: "eve@example.com" },
])
查询所有拥有电话号码的用户:
db.users.find( { phone: { $exists: true } } )
在这个例子中,稀疏索引只包含具有非空电话号码字段的文档。如果没有为电话号码字段创建稀疏索引,查询所有拥有电话号码的用户将需要扫描所有的文档,而稀疏索引可以显著提高查询性能。
总之,MongoDB的稀疏索引是一种特殊类型的索引,它只包含具有非空索引字段的文档。它可以提高查询性能并减少索引的存储空间,特别适用于处理稀疏数据集。
网友评论