Mongodb 对不存在的集合调用ensureIndex可以吗?

Mongodb 对不存在的集合调用ensureIndex可以吗?,mongodb,indexing,Mongodb,Indexing,我在某个地方读到,如果集合不存在,调用ensureIndex()实际上会创建一个集合。但是索引总是在某些字段上,而不是所有字段上,所以如果我确保在say{name:1}上建立索引,然后将文档添加到包含更多字段的集合中,那么索引会起作用吗?我知道我们没有模式,来自RDBMS世界,我只是想确定一下。:)我想在网站启动时创建索引,但最初数据库是空的。在确保索引之前,我不需要任何数据,对吗?ensureIndex将创建尚未存在的集合。如果您添加的文档不具有索引所覆盖的属性,这并不重要,您只是无法使用该索

我在某个地方读到,如果集合不存在,调用
ensureIndex()
实际上会创建一个集合。但是索引总是在某些字段上,而不是所有字段上,所以如果我确保在say
{name:1}
上建立索引,然后将文档添加到包含更多字段的集合中,那么索引会起作用吗?我知道我们没有模式,来自RDBMS世界,我只是想确定一下。:)我想在网站启动时创建索引,但最初数据库是空的。在确保索引之前,我不需要任何数据,对吗?

ensureIndex
将创建尚未存在的集合。如果您添加的文档不具有索引所覆盖的属性,这并不重要,您只是无法使用该索引查找这些文档。我的理解是,在1.7.4之前的版本中,如果文档缺少一个有索引的属性,它将被编入索引,就像它有该属性一样,但会有一个空值。在1.7.4之后的版本中,您可以创建根本不包含这些对象的稀疏索引。这种差异很小,但在某些情况下可能很明显


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

我使用的是ASP.NET MVC和官方的C#驱动程序,但我觉得这个问题与技术无关。不过,我还没有考虑将索引调用放入我的构建脚本中,这听起来很有趣,我需要了解如何从命令行调用
ensureIndex
。我认为应该可以从通过mongo shell加载的JS脚本调用
ensureIndex
。您可以使用
mongo db_name script.JS
运行JavaScript文件。该文件可以包含您可以在Mongo控制台中键入的大部分内容。