因此,我从[MongoDB Docs] [1]中读取了以下索引定义。
索引支持在MongoDB中高效执行查询。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用索引来限制它必须检查的文档数。
索引是存储其中一小部分的特殊数据结构 集合的数据集以易于遍历的形式设置。索引存储 由值排序的特定字段或字段集的值 领域的。索引条目的排序支持高效 等于匹配和基于范围的查询操作。此外, MongoDB可以使用索引中的顺序返回排序结果。
我有一个带有名为 pets 的集合的示例数据库。 宠物具有以下结构。
{
"_id": ObjectId(123abc123abc)
"name": "My pet's name"
}
我使用以下代码在 name 字段上创建了一个索引。
db.pets.createIndex({"name":1})
我期望在查询期间基于 name 字段按照升序对集合中的文档 pets 进行索引编制索引。此索引的结果可能会缩短整体查询时间,尤其是在策略性地构建具有可用索引的查询时。根据该假设,以下查询应按升序返回按 name 排序的所有 pets ,但它不会。
db.pets.find({},{"_id":0})
相反,它会按照插入的顺序返回 pets 。我的结论是,我对指数如何运作缺乏基本的了解。有人可以帮我理解吗?
答案 0 :(得分:1)
是的,它是关于索引如何工作的误解。
索引不会更改查询的输出,但会更改数据库引擎处理查询的方式。因此db.pets.find({},{"_id":0})
将始终以自然顺序返回文档,而不管是否存在索引。
只有在查询中使用索引时才会使用索引。从而,
db.pets.find({name : "My pet's name"},{"_id":0})
和db.pets.find({}, {_id : 0}).sort({name : 1})
将使用{name : 1}
索引。
您应该对查询运行explain
以检查是否正在使用索引。
您可能希望参考有关索引如何工作的文档。
https://docs.mongodb.com/manual/indexes/
https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/