我读到某个地方,如果它不存在,调用ensureIndex()
实际上会创建一个集合。但索引总是在某些字段上,而不是所有字段,所以如果我确定索引{ name:1 }
,然后将文档添加到具有更多字段的集合中,索引将起作用?我知道我们没有架构,来自RDBMS世界我只是想确定。 :)我想在我的网站启动时创建索引,但最初数据库是空的。在确保索引之前我不需要任何数据,这是正确的吗?
答案 0 :(得分:10)
ensureIndex
将创建该集合。如果添加没有索引所涵盖的属性的文档,则无法使用该索引来查找这些文档。我理解的方式是,在1.7.4之前的版本中,缺少具有索引的属性的文档将被索引,就像它具有该属性一样,但是将为null值。在1.7.4之后的版本中,您可以创建根本不包含这些对象的稀疏索引。差异很小但在某些情况下可能很重要。
根据具体情况,在应用启动时创建索引可能不是一个好主意。考虑一下您部署新版本的情况,该版本在启动时添加新索引,在开发中您不会注意到这一点,因为您只有一个小型数据库,但在生产中您可能拥有一个庞大的数据库并且添加索引将需要很多时间在索引创建过程中,您的应用会挂起,无法提供请求。您可以创建背景标志设置为true的索引(语法取决于您正在使用的驱动程序),但在大多数情况下,最好手动添加索引,或者作为安装脚本的一部分。这样你就必须在更新索引之前考虑一下。
答案 1 :(得分:0)
自 3.0 版起已弃用:db.collection.ensureIndex() 已 替换为 db.collection.createIndex()。
参考:https://docs.mongodb.com/manual/reference/method/db.collection.ensureIndex/