【发布时间】:2021-05-26 12:31:10
【问题描述】:
我想创建一个索引,以确保在 a manufacturer + art 的组合中没有重复的 serialNr。但有些项目没有serialNr。这些我不想检查/索引。
代码
mySchema.index({ serialNr: 1, art: 1 , manufacturer: 1, deleted: 1}, { unique: true, sparse: true)
我也尝试过添加部分过滤器:
partialFilterExpression: { serialNr: {$ne:null} } 到索引选项。
问题
我怎样才能索引它插入:
[{art: 'a', manufacturer:'a', deleted:null}, {art: 'a', manufacturer:'a', deleted:null}] 通过
和
[{serialNr: '123', art: 'a', manufacturer:'a', deleted:null}, {serialNr: '123', art: 'a', manufacturer:'a', deleted:null}]失败
我不想保存:
[{serialNr: null, art: 'a', manufacturer:'a', deleted:null}, {serialNr: null, art: 'a', manufacturer:'a', deleted:null}]
mongo 文档指出,如果复合索引中缺少字段,则不应对其进行索引:
稀疏索引仅根据 索引字段的存在,或者对于复合索引,存在 的索引字段。 https://docs.mongodb.org/manual/core/index-partial/
编辑:
新索引
implantSchema.index({ serialNr: 1, art: 1 , manufacturer: 1, deleted: 1}, { unique: true, partialFilterExpression: { serialNr: {$exists:true} }})
在对索引进行更改之前,我将collection 放到我的开发数据库中,以确保不存在旧索引。这是db.items.getIndexes()返回的新索引
/* 0 */
{
"0": {
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "LOC_db.items"
},
"1": {
"v" : 1,
"unique" : true,
"key" : {
"serialNr" : 1,
"art" : 1,
"manufacturer" : 1,
"deleted" : 1
},
"name" : "serialNr_1_art_1_manufacturer_1_deleted_1",
"ns" : "LOC_db.items",
"partialFilterExpression" : {
"serialNr" : {
"$exists" : true
}
},
"background" : true
}
}
数据
- 我有一个预保存挂钩,我在其中检查
serialNr的值,之前不存在,dup error被返回。 - 查询数据库时,不存在
doc,它具有null、""作为serialNr的值。 - 查询
db.items.find({ serialNr: {$exists:true} })不匹配任何项目。
错误
insertDocument :: caused by :: 11000 E11000 duplicate key error index: LOC_db.items.$serialNr_1_art_1_manufacturer_1_deleted_1 dup key: { : null, : "Robo", : "Olymp", : null }
其他信息
【问题讨论】:
-
问题是什么?您已经回答了自己,使用具有稀疏性的唯一索引...另外,您为什么要删除索引?
-
那行不通,这就是问题存在的原因。我索引已删除,因为它是即使用户删除它也需要保留的数据。因此,deleted 为 null 或用户删除数据的日期。
-
实际上,如果删除日期,我不会在删除时保存“null”,这是错误的。
标签: node.js mongodb mongoose mongoose-schema