【问题标题】:Is it OK to call ensureIndex on non-existent collections?可以在不存在的集合上调用 ensureIndex 吗?
【发布时间】:2011-07-15 19:35:35
【问题描述】:

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

【问题讨论】:

    标签: mongodb indexing


    【解决方案1】:

    自 3.0 版起已弃用:db.collection.ensureIndex() 已被 替换为 db.collection.createIndex()。

    参考:https://docs.mongodb.com/manual/reference/method/db.collection.ensureIndex/

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我正在使用 ASP.NET MVC 和官方 C# 驱动程序,但我觉得这个问题与技术无关。不过,我还没有考虑将索引调用放入我的构建脚本中,这听起来很有趣,我需要了解如何从命令行调用 ensureIndex
      • 我认为应该可以从通过mongo shell加载的JS脚本调用ensureIndex
      • 您可以使用 mongo db_name script.js 运行 JavaScript 文件。该文件可以包含您可以在 Mongo 控制台中键入的大部分内容。
      猜你喜欢
      • 1970-01-01
      • 2011-11-16
      • 2019-04-10
      • 1970-01-01
      • 2011-11-26
      • 2022-01-09
      • 2011-11-19
      • 2013-05-03
      • 2013-08-18
      相关资源
      最近更新 更多