我正在尝试在集合中添加唯一文档。但问题是我想根据2个字段来决定唯一性。所以我在网上找到了解决方案。令我困惑的是,INDEX
在这里的目的是什么?在RDBMS索引中通常是用于行id的单词,这在这里意味着什么以及它如何影响唯一性?
var patientSchema = mongoose.Schema({
name : String,
fatherOrHusbandName : String,
address : String,
});
patientSchema .***index***({ email: 1, sweepstakes_id: 1 }, { unique: true });
答案 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属性的文档,这两个属性在所有其他文档中都是唯一的。
所以,不要在'行'中考虑'文件'