我在某处读到调用 ensureIndex()
实际上会创建一个集合(如果它不存在)。但是索引总是在某些字段上,而不是全部,所以如果我确保在说 { name:1 }
上有一个索引,然后将文档添加到具有更多字段的集合中,索引将工作?我知道我们没有架构,我只是想确定一下来自 RDBMS 世界。 :) 我想在我的网站启动时创建索引,但最初数据库是空的。在确保索引之前我不需要任何数据,对吗?
最佳答案
如果集合尚不存在,
ensureIndex
将创建该集合。如果您添加的文档不具有索引所涵盖的属性,则无关紧要,您只是无法使用该索引来查找这些文档。我理解它的方式是,在 1.7.4 之前的版本中,缺少具有索引的属性的文档将被索引,就好像它具有该属性一样,但将为空值。在 1.7.4 之后的版本中,您可以创建根本不包含这些对象的稀疏索引。差异很小,但在某些情况下可能很显着。
根据具体情况,在应用启动时创建索引可能不是一个好主意。考虑部署一个新版本启动时添加新索引的情况,在开发中您不会注意到这一点,因为您只有一个小数据库,但在生产中您可能有一个巨大的数据库并且添加索引将花费很多时间的时间。在创建索引期间,您的应用程序将挂起并且您无法处理请求。您可以创建将背景标志设置为 true 的索引(语法取决于您使用的驱动程序),但在大多数情况下,最好手动添加索引,或者作为设置脚本的一部分。这样你就必须在更新索引之前考虑一下。
https://stackoverflow.com/questions/5312574/
相关文章:
mongodb - 我应该使用哪个 Node 的 mongo 驱动程序?
javascript - node.js mongodb - collection.find().t
mongodb - 文档数据库是否适合存储大量股票报价数据?
javascript - Mongodb v4.0 事务,MongoError : Transact
mongodb - 通过 REST API 公开 mongodb 查询是否安全?
mongodb - 使用 ReadPreference=NEAREST 的 Mongos 路由
mongodb-csharp 驱动程序 - 如何将属性保存为引用而不是嵌入?