问题 可以在不存在的集合上调用ensureIndex吗?


我读到某个地方打来电话 ensureIndex() 实际上创建一个集合,如果它不存在。但是索引总是在某些字段上,而不是所有字段,所以如果我确保索引就说 { name:1 } 然后将文档添加到具有更多字段的集合中,索引将起作用?我知道我们没有架构,来自RDBMS世界我只是想确定。 :)我想在我的网站启动时创建索引,但最初数据库是空的。在确保索引之前我不需要任何数据,这是正确的吗?


1070
2018-03-15 13:40


起源



答案:


ensureIndex 如果它尚不存在,将创建该集合。如果添加没有索引所涵盖的属性的文档,则无法使用该索引来查找这些文档。我理解它的方式是,在1.7.4之前的版本中,缺少具有索引的属性的文档将被索引,就像它具有该属性一样,但是将为null值。在1.7.4之后的版本中,您可以创建根本不包含这些对象的稀疏索引。差异很小但在某些情况下可能很重要。

根据具体情况,在应用启动时创建索引可能不是一个好主意。考虑一下您部署新版本的情况,该版本在启动时添加新索引,在开发中您不会注意到这一点,因为您只有一个小型数据库,但在生产中您可能拥有一个庞大的数据库并且添加索引将需要很多时间在索引创建过程中,您的应用会挂起,无法提供请求。您可以创建背景标志设置为true的索引(语法取决于您使用的驱动程序),但在大多数情况下,最好手动添加索引,或者作为安装脚本的一部分。这样你就必须在更新索引之前考虑一下。


10
2018-03-15 13:53



我特意使用ASP.NET MVC和官方C#驱动程序,但我觉得这个问题与技术无关。我没有想过将索引调用放入我的构建脚本中,但这听起来很有趣,我需要找出如何调用 ensureIndex 从命令行。 - Pawel Krakowiak
我认为应该可以打电话 ensureIndex 来自通过mongo shell加载的JS脚本。 - Pawel Krakowiak
您可以使用运行JavaScript文件 mongo db_name script.js。该文件可以包含您可以在Mongo控制台中键入的大多数内容。 - Theo


答案:


ensureIndex 如果它尚不存在,将创建该集合。如果添加没有索引所涵盖的属性的文档,则无法使用该索引来查找这些文档。我理解它的方式是,在1.7.4之前的版本中,缺少具有索引的属性的文档将被索引,就像它具有该属性一样,但是将为null值。在1.7.4之后的版本中,您可以创建根本不包含这些对象的稀疏索引。差异很小但在某些情况下可能很重要。

根据具体情况,在应用启动时创建索引可能不是一个好主意。考虑一下您部署新版本的情况,该版本在启动时添加新索引,在开发中您不会注意到这一点,因为您只有一个小型数据库,但在生产中您可能拥有一个庞大的数据库并且添加索引将需要很多时间在索引创建过程中,您的应用会挂起,无法提供请求。您可以创建背景标志设置为true的索引(语法取决于您使用的驱动程序),但在大多数情况下,最好手动添加索引,或者作为安装脚本的一部分。这样你就必须在更新索引之前考虑一下。


10
2018-03-15 13:53



我特意使用ASP.NET MVC和官方C#驱动程序,但我觉得这个问题与技术无关。我没有想过将索引调用放入我的构建脚本中,但这听起来很有趣,我需要找出如何调用 ensureIndex 从命令行。 - Pawel Krakowiak
我认为应该可以打电话 ensureIndex 来自通过mongo shell加载的JS脚本。 - Pawel Krakowiak
您可以使用运行JavaScript文件 mongo db_name script.js。该文件可以包含您可以在Mongo控制台中键入的大多数内容。 - Theo