我想使用唯一的复合索引来强制文档某些字段的唯一性。
使用猫鼬时,有两种创建索引的方法:
Model.ensureIndexes()
(1.) The mongoose documentation clearly states
应用程序启动时,Mongoose自动 为架构中的每个已定义索引调用createIndex。
[...]
虽然对开发有利,但建议在生产中禁用此行为,因为创建索引会导致significant performance impact。
而且,每次将新文档添加到集合中时,重新启动数据库似乎都没有真正的“生产力”。
创建索引的第二种方法相同:
不建议您在生产环境中运行它。索引创建可能会影响数据库性能,具体取决于您的负载。请谨慎使用。
Source
将此问题扩展到特定示例:
对于每个文档,两个特定字段的组合应该是唯一的(例如,“ year”和“ course”),所以我使用的是唯一的复合索引。
保存新文档后,可能会有第二个请求具有相同的值,因为它是重复的,因此应该触发错误。
如果尚未创建索引,则仍将保存文档。
因此,这是(如标题所强调的)确保唯一性。也许每次保存新文档时都使用索引并对其进行重建不是正确的方法;我愿意接受替代方案。
那么我们应该如何确保唯一性呢?
答案 0 :(得分:0)
来自文档:https://mongoosejs.com/docs/faq.html
MongoDB会保留索引,因此,如果您是从一个全新的数据库开始或运行了db.dropDatabase(),则只需重建索引。
创建索引后,MongoDB将使它们保持最新。因此,当添加新文档时,我们不需要手动重建索引。
启动时,我们可以等待直到新索引准备就绪:
Model.init().then(function() {
// indexes are ready here
Model.create([{ name: 'Val' }, { name: 'Val' }], function(err) {
});
});
还请记住:
在生产环境中,您应该[使用MongoDB shell创建索引])(https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/),而不要依靠猫鼬为您完成操作。