Javascript Mongoose/节点服务器重新启动并复制
好的,经过大量的尝试和错误,我确定当我删除一个集合,然后通过我的应用程序重新创建它时,unique在我重新启动本地节点服务器之前不起作用。这是我的模式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
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()
,这样会使索引保持不变因此,通常最好为生产系统制定一个部署计划,以便确定需要做什么。这篇文章似乎认为在重新启动时不会重新构建索引:嘿,尼尔,感谢你的帮助。我对Mongo有点陌生。所以,如果有任何机会,你可以解释为什么需要重新启动才能使unique正常工作?我确实检查了我的调试日志,看到“subscriptions.ensureIndex”在每次重新启动时都会运行,但为什么在创建文档后的第二次删除的集合上会出现这种情况?@GregThompson这里的困惑可能在于MongoDB和mongoose在默认情况下将在不存在的集合的位置“创建”该集合。因此,当您删除一个集合时,您不需要创建它。
.drop()
方法也会删除索引,但反过来不适用于集合创建。另一方面,.ensureIndex()
将创建一个不存在的集合,并创建索引。mongoose.ensureIndex()
根据与模型关联的模式定义创建所有索引。