【发布时间】:2011-07-15 19:35:35
【问题描述】:
我在某处读到调用ensureIndex() 实际上会创建一个集合(如果它不存在)。但是索引总是在某些字段上,而不是所有字段上,所以如果我确保在{ name:1 } 上建立索引,然后将文档添加到具有更多字段的集合中,索引会起作用吗?我知道我们没有架构,我只是想确定一下来自 RDBMS 世界。 :) 我想在我的网站启动时创建索引,但最初数据库是空的。在确保索引之前我不需要任何数据,对吗?
【问题讨论】:
我在某处读到调用ensureIndex() 实际上会创建一个集合(如果它不存在)。但是索引总是在某些字段上,而不是所有字段上,所以如果我确保在{ name:1 } 上建立索引,然后将文档添加到具有更多字段的集合中,索引会起作用吗?我知道我们没有架构,我只是想确定一下来自 RDBMS 世界。 :) 我想在我的网站启动时创建索引,但最初数据库是空的。在确保索引之前我不需要任何数据,对吗?
【问题讨论】:
自 3.0 版起已弃用:db.collection.ensureIndex() 已被 替换为 db.collection.createIndex()。
参考:https://docs.mongodb.com/manual/reference/method/db.collection.ensureIndex/
【讨论】:
ensureIndex 将在集合尚不存在时创建该集合。如果您添加的文档不具有索引所涵盖的属性,则无关紧要,您只是无法使用该索引来查找这些文档。我理解它的方式是,在 1.7.4 之前的版本中,缺少具有索引的属性的文档将被索引,就像它具有该属性一样,但将为空值。在 1.7.4 之后的版本中,您可以创建根本不包含这些对象的稀疏索引。差异很小,但在某些情况下可能很显着。
根据具体情况,在应用启动时创建索引可能不是一个好主意。考虑部署新版本的情况,该版本在启动时会添加新索引,在开发中您不会注意到这一点,因为您只有一个小数据库,但在生产中您可能有一个巨大的数据库,添加索引将花费很多时间的时间。在创建索引期间,您的应用程序将挂起并且您无法处理请求。您可以创建将背景标志设置为 true 的索引(语法取决于您使用的驱动程序),但在大多数情况下,最好手动添加索引,或者作为设置脚本的一部分。这样你就必须在更新索引之前考虑一下。
【讨论】:
ensureIndex。
ensureIndex。
mongo db_name script.js 运行 JavaScript 文件。该文件可以包含您可以在 Mongo 控制台中键入的大部分内容。