我无法理解一件事。正如我们在Moongose docs中所读到的那样:
当您的应用程序启动时,Mongoose会自动为您架构中的每个已定义索引调用
ensureIndex
。虽然很适合开发,但建议在生产中禁用此行为,因为创建索引会对性能产生重大影响。通过将架构的autoIndex
选项设置为false
来禁用该行为。
那么在开发中默认使用ensureIndex
是什么意思,如果有更好的方法在生产模式下禁用它(更敏感的地方)。不应该是对方吗?我们在开发中测试并确保我们的索引在生产中工作?
不应该总是调用此方法吗?如果我们想使用索引,并且我们不确定MongoDb是否创建了一个,为什么我们可以选择使用它,这在Mongoose中没有硬编码,以确保我们总是拥有和索引?
我可能误解了一些事情,所以我很感激能让我直截了当。
答案 0 :(得分:2)
我们在开发中测试并确保我们的索引在生产中工作?
不,不,想象一下你的编程中出现了意外的变化,这意味着必须重建覆盖多个分片和复制副本的索引。
最好是在开发中实现这一点而不是生产。
总是不应该调用此方法吗?
不,由于错误/错别字而意外重新配置和重建索引是一个真正的威胁,因为我发现自己一次。
我个人实际上现在只在shell中创建所有索引。
答案 1 :(得分:1)
他们可能已经采用了该设置默认值。它可能只是默认情况下被禁用,然后他们就不必制作你应该在生产中禁用它的免责声明。
至于2.如果您有十亿条记录要编入索引,并且您在模型中添加了一个新索引而未意识到它尚未投入生产,那么这将会使您的服务器停顿一天。
答案 2 :(得分:0)
因为你可能想要构建mongoose架构不支持的特殊索引,例如:文本搜索索引“text”,你可以使用
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()