Mongoose在启动时调用ensureIndex,但不推荐。 那么为什么这是默认的?
我不明白一件事。 正如我们在Moongose文档中所读到的 :
当您的应用程序启动时,Mongoose将自动为您的模式中定义的每个索引调用
ensureIndex
。 尽pipe对开发很好,但build议在生产中禁用此行为,因为索引创build可能会对性能产生重大影响。 通过将模式的autoIndex
选项设置为false
来禁用此行为。
-
那么如果在生产模式(更敏感的地方)中最好禁用它,那么在开发中默认使用
ensureIndex
有什么意义。 它不应该是相反的吗? 我们在开发中进行testing,并确保我们的索引在生产中工作? -
不应该总是调用这个方法吗? 如果我们想要使用索引,并且我们不确定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()