【问题标题】: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 来禁用该行为。

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

  2. 不应该总是调用这个方法吗?如果我们想使用索引,并且我们不确定 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()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-28
          • 2018-02-08
          • 1970-01-01
          • 1970-01-01
          • 2014-05-10
          • 2012-01-12
          • 1970-01-01
          • 2011-10-23
          相关资源
          最近更新 更多