Mongoose / Node服务器重启并重复

时间:2014-07-23 03:55:11

标签: javascript node.js mongodb mongoose mongodb-query

好的,经过大量的反复试验,我确定当我删除一个集合然后通过我的应用程序重新创建它时,在我重新启动本地节点服务器之前,unique不起作用。这是我的架构

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var Services = new Schema ({ 
    type : {type : String},
    subscriptionInfo : Schema.Types.Mixed,
    data : Schema.Types.Mixed
},{_id:false});

var Hashtags = new Schema ({
    name: {type : String},
    services : [Services]
},{_id:false});

var SubscriptionSchema = new Schema ({
    eventId : {type: String, index: { unique: true, dropDups: true }}, 
    hashtags : [Hashtags]
});

module.exports = mongoose.model('Subscription', SubscriptionSchema);

这是我的路线......

router.route('/')
        .post(function(req, res) {
            var subscription = new subscribeModel();
            subscription.eventId = eventId;
            subscription.save(function(err, subscription) {
                if (err)
                    res.send(err);
                else
                    res.json({
                        message: subscription
                    });
            });
        })

如果我删除了该集合,然后点击上面看到的/ subscribe端点,它将创建该条目,但不会遵守该副本。直到我重新启动服务器才开始尊重它。任何想法为什么会这样?谢谢!

2 个答案:

答案 0 :(得分:2)

当你的应用程序启动并且它自己初始化时,mongoose会做什么,扫描已注册模型的模式定义,并为所提供的参数调用.ensureIndexes()方法。这是"by design"行为,也包含在此声明中:

  

当您的应用程序启动时,Mongoose会自动为架构中的每个已定义索引调用ensureIndex。虽然很适合开发,但建议在生产中禁用此行为,因为索引创建可能会导致significant performance impact。通过将架构的autoIndex选项设置为false来禁用该行为。

所以你的一般选择是:

  1. 不要"掉#34;集合和调用.remove()使索引保持不变。

  2. 当您对集合发出删除以重建它们时,请手动调用.ensureIndexes()

  3. 文档中的警告通常是为大型集合创建索引可能需要一些时间并占用服务器资源。如果索引存在,这或多或少是一个" no-op"到MongoDB,但要注意索引定义的微小变化,这将导致创建"额外的"索引。

    因此,通常最好为生产系统制定部署计划,以确定需要完成的工作。

答案 1 :(得分:0)

这篇文章似乎认为重启时不会重建索引:Are MongoDB indexes persistent across restarts?