在MongoDB中创建新文档时,如何确保某些字段的唯一性?

时间:2019-03-20 11:58:35

标签: node.js mongodb mongoose

我想使用唯一的复合索引来强制文档某些字段的唯一性。

使用猫鼬时,有两种创建索引的方法:

  1. 通过重新启动MongoDB
  2. 通过致电Model.ensureIndexes()

(1.) The mongoose documentation clearly states

  

应用程序启动时,Mongoose自动   为架构中的每个已定义索引调用createIndex。
  [...]
  虽然对开发有利,但建议在生产中禁用此行为,因为创建索引会导致significant performance impact

而且,每次将新文档添加到集合中时,重新启动数据库似乎都没有真正的“生产力”。


创建索引的第二种方法相同:

  

不建议您在生产环境中运行它。索引创建可能会影响数据库性能,具体取决于您的负载。请谨慎使用。   
Source

将此问题扩展到特定示例:

对于每个文档,两个特定字段的组合应该是唯一的(例如,“ year”和“ course”),所以我使用的是唯一的复合索引。
保存新文档后,可能会有第二个请求具有相同的值,因为它是重复的,因此应该触发错误。
如果尚未创建索引,则仍将保存文档。 因此,这是(如标题所强调的)确保唯一性。也许每次保存新文档时都使用索引并对其进行重建不是正确的方法;我愿意接受替代方案。

那么我们应该如何确保唯一性呢?

1 个答案:

答案 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/),而不要依靠猫鼬为您完成操作。