根据MongooseJSMongoDB/Node.js的mongoose documentation:

当应用程序启动时,Mongoose会自动为模式中定义的每个索引调用ensureIndex.虽然对于开发来说很好,但建议在生产中禁用此行为,因为创建索引可能会对性能产生重大影响.通过将模式的autoIndex选项设置为false来禁用该行为.

这似乎指示在部署之前从mongoose中删除自动索引,以优化mongoose,而不是在应用程序启动时指示Mongogo 翻阅所有索引,这似乎是有道理的.

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

Edit:作为补充,MongoDB为how个索引提供了良好的documentation个,但不应该执行whywhen个显式索引指令.在我看来,编写器应用程序应该在具有现有索引的集合上自动更新索引,而ensureIndex实际上更像是一次性的事情(在应用新索引时完成),在这种情况下,Mongoose的autoIndex应该在正常服务器重启时不起作用.

推荐答案

我一直不明白为什么Mongoose文档如此广泛地建议在生产中禁用autoIndex.一旦添加了索引,随后的ensureIndex次调用只会看到索引已经存在,然后返回.因此,它只会在您第一次创建索引时对性能产生影响,而此时集合通常是空的,因此创建索引无论如何都会很快.

我的建议是启用autoIndex,除非你有一个给你带来麻烦的特殊情况;比如,如果你想向一个拥有数百万文档的现有集合添加一个新索引,并且你想对它的创建时间有更多的控制.

Node.js相关问答推荐

如何在Node js中从MongoDB获取特定数据,使用GET方法?

可以删除一个mongodb catch块

如何修复PayPal Node.js Webhook中Webhook签名验证失败?''

如何在JavaScript中使用Mongoose将项推送到MongoDB中的重嵌套数组

是否可以在MongoDB中比较和匹配引用文档中的字段

如何修复PostgreSQL和NodeJS/NestJS应用程序之间的日期时间和时区问题?

条件内的表达式

当API返回400状态代码时,使用Reactjs fetch获取错误消息

Redis Typescript 删除方法类型转换

Typescript typeRoots 未检测到类型定义

使用中的端口代码:'EADDRINUSE',即使在 kill 命令之后

`npm install` 以Killed结尾

Node.js 表达的 Error 对象expose 了哪些属性?

等价于 Node.js 的 Rails 控制台

在本地运行 Cloud Functions 会出现错误functions.config() 不可用

Node.js + Express + Handlebars.js + 局部视图

在Go中,编写非阻塞代码有意义吗?

使用 Node.JS,如何按时间顺序获取文件列表?

Forever + Nodemon 一起运行

当我try 向我的 S3 存储桶 (Node.js) 发送内容时,AWS 缺少凭证