【问题标题】:Mongoose call ensureIndex on startup, but it's not recommended. So why it's defaul?Mongoose 在启动时调用 ensureIndex,但不推荐。那为什么默认呢?
【发布时间】:2014-01-21 07:14:31
【问题描述】:
我无法理解一件事。正如我们在Moongose docs 中看到的:
当您的应用程序启动时,Mongoose 会自动为您架构中定义的每个索引调用ensureIndex。虽然很适合开发,但建议在生产中禁用此行为,因为创建索引会导致显着的性能影响。通过将架构的 autoIndex 选项设置为 false 来禁用该行为。
那么在开发中默认使用ensureIndex 有什么意义,如果最好在生产模式(更敏感的地方)禁用它。不应该是对面吗?我们在开发中进行测试并确保我们的索引在生产中有效?
不应该总是调用这个方法吗?如果我们想使用索引,并且我们不确定 MongoDb 是否创建了索引,为什么我们可以选择使用它,而且这在 Mongoose 中没有硬编码,以确保我们始终拥有和索引?
我可能误解了什么,所以我会很感激你把我说清楚。
【问题讨论】:
标签:
node.js
mongodb
mongoose
【解决方案1】:
我们在开发中进行测试并确保我们的索引在生产中有效?
不,想象一下您的编程中发生了意外更改,这意味着必须重建覆盖多个分片和副本集的索引。
在开发中比在生产中发生更好。
不应该总是调用这个方法吗?
不,由于错误/拼写错误而意外重新配置和重建索引是一个真正的威胁,因为我曾经发现自己。
我个人实际上只是现在才在 shell 中创建所有索引。
【解决方案2】:
他们可能会采用该设置默认值。它可能应该在默认情况下被禁用,然后他们不必做出免责声明,您应该在生产中禁用它。
至于 2。如果您有 10 亿条记录要索引,并且您在模型中添加了一个新索引而没有意识到它不在生产环境中,这将导致您的服务器中断一天。
【解决方案3】:
因为您可能想要构建 mongoose 架构不支持的特殊索引,例如:文本搜索索引“文本”,您可以使用
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()