Mongoose在启动时调用ensureIndex,但不推荐。 那么为什么这是默认的?

我不明白一件事。 正如我们在Moongose文档中所读到的 :

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

  1. 那么如果在生产模式(更敏感的地方)中最好禁用它,那么在开发中默认使用ensureIndex有什么意义。 它不应该是相反的吗? 我们在开发中进行testing,并确保我们的索引在生产中工作?

  2. 不应该总是调用这个方法吗? 如果我们想要使用索引,并且我们不确定MongoDb是否创build了一个,为什么我们可以select使用这个,这不是硬编码的Mongoose,以确保我们总是有索引?

我可能误解了一些东西,所以我会很乐意把我弄直。

我们在开发中进行testing,并确保我们的索引在生产中工作?

地狱不,想象一下你的编程意外发生了变化,这意味着一个覆盖多个碎片和复制品的索引必须被重build。

在开发中比在生产中更好地发生。

不应该总是调用这个方法吗?

不,因为错误/错别字而意外地重新configuration和重build索引是一个真正的威胁,因为我发现了自己一次。

我个人实际上只是现在在shell中的所有索引。

他们可能会用这种设置默认的方式。 它可能应该只是被默认禁用,然后他们不必作出免责声明,你应该在生产中禁用它。

至于2.如果你有十亿条logging要索引,并且在你的模型中添加一个新的索引而没有意识到它没有在生产中,这将会使你的服务器在一天之内被终止。

因为你可能想build立mongoose模式不支持的特殊索引,例如:文本search索引“文本”,你可以使用

 Model.collection.ensusreIndex( { title: "text", tags: "text", description: "text" }, { weights: { title: 10, tags: 5, }, name: "TextIndex" },function(err,data){ if(err){ return res.send({success:false,err:err}) }else{ return res.send({success:true,res:'successfuly build index'}) }; }) ) 

所以在这个原因你必须自己调用ensureIndex()