Mongoose Schema中的索引目的

时间:2016-04-24 12:12:37

标签: mongodb mongoose

我正在尝试在集合中添加唯一文档。但问题是我想根据2个字段来决定唯一性。所以我在网上找到了解决方案。令我困惑的是,INDEX在这里的目的是什么?在RDBMS索引中通常是用于行id的单词,这在这里意味着什么以及它如何影响唯一性?

var patientSchema = mongoose.Schema({
  name : String,
  fatherOrHusbandName : String,
  address : String,
});


patientSchema .***index***({ email: 1, sweepstakes_id: 1 }, { unique: true });

2 个答案:

答案 0 :(得分:4)

  

索引支持在MongoDB中高效执行查询。没有   索引,MongoDB必须执行收集扫描,即每次扫描   集合中的文档,用于选择与之匹配的文档   查询语句。如果查询存在适当的索引,则为MongoDB   可以使用索引来限制它必须检查的文档数量。

有关详细信息,请参阅this documentation

阅读本文档后请不要混淆,因为在本文档中使用createIndex并且您的代码使用了index MongoDB createIndex和内部执行MongoDB操作的 mongoose index

如果您的数据库中没有数据,那么它将正常工作

patientSchema .index({ email: 1, sweepstakes_id: 1 }, { unique: true });

但是如果您在数据库中有一些重复项目的数据,那么您应该使用dropDups关键字来创建唯一索引。

但在使用dropDups之前你应该知道一件事。如果您使用dropDups: true并且您有一些重复值的数据,那么请在您的数据库中保留一个文档,其他所有数据将删除(重复数据)。

像:

patientSchema .index({ email: 1, sweepstakes_id: 1 }, { unique: true, dropDups: true });

答案 1 :(得分:3)

它实际上与RDBMS中的索引具有相同的目的。你只需要用一些mongo术语来思考。在mongodb而不是Tables中,您有文档,而不是行。 使用mongoose,您在此集合中定义了一个集合' Patient'(索引属于Patient collection ),您在文档属性email和sweepstakes_id上定义了一个唯一索引。

每次在Patient集合中保存文档时,mongodb都会确保设置了email和sweepstakes_id属性的文档,这两个属性在所有其他文档中都是唯一的。

所以,不要在'行'中考虑'文件'