node.js - 生产代码中的 Mongoose 索引

根据 Mongoose documentation对于 MongooseJSMongoDB/Node.js :

When your application starts up, Mongoose automatically calls ensureIndex for each defined index in your schema. While nice for development, it is recommended this behavior be disabled in production since index creation can cause a significant performance impact. Disable the behavior by setting the autoIndex option of your schema to false.

这似乎指示在部署之前从 mongoose 中删除自动索引,以优化 Mongoose 从指示 Mongo 在应用程序启动时遍历所有索引,这似乎是有道理的。

在生产代码中处理索引的正确方法是什么?也许外部脚本应该生成索引?或者,如果单个应用程序是集合的唯一读取器/写入器,那么 ensureIndex 可能是不必要的,因为它会在每次数据库写入发生时继续索引?

编辑:作为补充,MongoDB 提供了很好的 documentation 如何 做索引,而不是 whywhen 明确的索引指令应该做。在我看来,索引应该由编写器应用程序自动在具有现有索引的集合上保持最新,并且 ensureIndex 实际上更像是一次性的事情(在应用新索引时完成) ,在这种情况下,Mongoose 的 autoIndex 在正常的服务器重启下应该是空操作。

最佳答案

我一直不明白为什么 Mongoose 文档如此广泛地建议在生产环境中禁用 autoIndex。添加索引后,后续的 ensureIndex 调用将简单地看到索引已经存在,然后返回。所以它只会在你第一次创建索引时对性能产生影响,那时集合通常是空的,所以无论如何创建索引都会很快。

我的建议是启用 autoIndex ,除非您遇到特定情况给您带来麻烦;例如,如果您想向拥有数百万个文档的现有集合添加新索引,并且想要更好地控制它的创建时间。

https://stackoverflow.com/questions/14342708/

相关文章:

java - 运行集成测试时嵌入 MongoDB

mongodb - mongorestore 错误 : Don't know what to do

javascript - Mongoose 子文档与嵌套模式

mongodb - 如何删除mongodb中的数组元素?

node.js - Mongoose (mongodb)批量插入?

node.js - 如何在 MongoDB 中按日期对集合进行排序?

node.js - 如何使用 2d 地理索引在 Mongoose 模式中正确定义数组中的对象

mongodb - Mongoose -- 强制集合名称

javascript - mongoose vs mongodb(nodejs模块/扩展),哪个更好

node.js - 使用 MongoClient v3.0 时 db.collection 不是函数