【问题标题】:Mongoose/Node server restart and duplicatesMongoose/Node 服务器重启和重复
【发布时间】:2017-06-27 16:19:54
【问题描述】:

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

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 端点,它将创建条目但不会尊重重复项。直到我重新启动服务器,它才开始兑现它。任何想法为什么会这样?谢谢!

【问题讨论】:

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


    【解决方案1】:

    当您的应用程序启动并初始化时,mongoose 会扫描您的模式定义以查找已注册的模型,并为提供的参数调用 .ensureIndexes() 方法。这是"by design" 行为,也包含在以下语句中:

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

    所以你的一般选择是:

    1. 不要“丢弃”集合并调用.remove(),这会使索引保持不变。

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

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

    因此,通常最好为生产系统制定部署计划,您可以在其中确定需要做什么。

    【讨论】:

    • 嗨,尼尔,感谢您的帮助。我对Mongo有点陌生。因此,如果有任何机会您可以解释为什么需要重新启动才能使独特的工作?我确实检查了我的调试日志并看到“subscriptions.ensureIndex”每次重新启动都会运行,但是为什么在创建文档后第二次删除的集合上会有所不同?
    • @GregThompson 也许这里的混淆在于 MongoDB 和 mongoose 将在默认情况下“创建”不存在的集合。因此,当您删除一个集合时,您不需要创建它。 .drop() 方法也将删除索引,但反向不适用于集合创建。另一方面,.ensureIndex() 创建一个不存在的集合以及创建索引。 mongoose .ensureIndexes() 根据与模型关联的模式定义创建所有索引。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 1970-01-01
      • 2013-03-02
      • 2014-07-25
      • 2021-04-14
      • 2019-01-08
      • 2014-12-11
      • 2021-06-04
      • 1970-01-01
      相关资源
      最近更新 更多