好的,经过大量的试验和错误,我已经确定,当我删除一个集合,然后通过我的应用程序重新创建它时,唯一的不起作用,直到我重新启动我的本地节点服务器。这是我的模式
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端点,它将创建条目,但不会接受重复的条目。直到我重新启动服务器,它才开始支持它。你知道为什么会这样吗?谢谢!
发布于 2014-07-23 12:17:08
当您的应用程序启动并自行初始化时,mongoose所做的是扫描注册模型的模式定义,并调用.ensureIndexes()方法获取所提供的参数。这是"by design"行为,也包含在下面的语句中:
当您的应用程序启动时,
会自动为您的模式中定义的每个索引调用ensureIndex。虽然适合开发,但建议在生产中禁用此行为,因为创建索引可能会导致significant performance impact。通过将模式的autoIndex选项设置为false来禁用该行为。
因此,您在这里的常规选项是:
.remove(),这会使索引在执行drop命令以重新构建集合时调用.ensureIndexes()。文档中的警告通常是为大型集合创建索引可能需要一些时间并占用服务器资源。如果索引存在,这或多或少是对MongoDB的"no-op“,但是要注意索引定义的细微变化,这将导致创建”额外的“索引。
因此,通常最好为生产系统制定一个部署计划,您可以在其中确定需要执行的操作。
发布于 2015-05-29 02:03:19
这篇文章似乎认为在重新启动时索引不会重新构建:Are MongoDB indexes persistent across restarts?
https://stackoverflow.com/questions/24901570
复制相似问题