Javascript Mongoose/节点服务器重新启动并复制

Javascript Mongoose/节点服务器重新启动并复制,javascript,node.js,mongodb,mongoose,mongodb-query,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, da

好的,经过大量的尝试和错误,我确定当我删除一个集合,然后通过我的应用程序重新创建它时,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端点,它将创建条目,但不会接受副本。直到我重新启动服务器,它才开始尊重它。你知道为什么吗?谢谢

当应用程序启动并自身初始化时,mongoose所做的是扫描模式定义以查找已注册的模型,并为提供的参数调用方法。这是行为,也包含在本声明中:

当应用程序启动时,Mongoose会自动为模式中的每个已定义索引调用ensureIndex。虽然对于开发来说不错,但建议在生产中禁用此行为,因为创建索引可能会导致错误。通过将架构的“自动索引”选项设置为false来禁用该行为

因此,您的一般选择如下:

  • 不要“删除”集合并调用
    .remove()
    ,这样会使索引保持不变

  • 在对集合发出放置命令以重新生成集合时手动调用

  • 文档中的警告通常是,为大型集合创建索引可能需要一些时间并占用服务器资源。如果索引存在,这对MongoDB来说或多或少是一个“无操作”,但要注意对索引定义的微小更改,这将导致创建“附加”索引


    因此,通常最好为生产系统制定一个部署计划,以便确定需要做什么。

    这篇文章似乎认为在重新启动时不会重新构建索引:

    嘿,尼尔,感谢你的帮助。我对Mongo有点陌生。所以,如果有任何机会,你可以解释为什么需要重新启动才能使unique正常工作?我确实检查了我的调试日志,看到“subscriptions.ensureIndex”在每次重新启动时都会运行,但为什么在创建文档后的第二次删除的集合上会出现这种情况?@GregThompson这里的困惑可能在于MongoDB和mongoose在默认情况下将在不存在的集合的位置“创建”该集合。因此,当您删除一个集合时,您不需要创建它。
    .drop()
    方法也会删除索引,但反过来不适用于集合创建。另一方面,
    .ensureIndex()
    将创建一个不存在的集合,并创建索引。mongoose
    .ensureIndex()
    根据与模型关联的模式定义创建所有索引。