猫鼬复合索引唯一+稀疏
Mongoose Compound Index Unique + Sparse
我想创建一个索引,以确保在 manufacturer
+ art
的组合中没有重复的 serialNr
。但是有些项目没有 serialNr
。这些我不想check/index.
代码
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 文档指出,如果复合索引中缺少某个字段,则不应为其编制索引:
Sparse indexes selects documents to index solely based on the
existence of the indexed field, or for compound indexes, the existence
of the indexed fields.
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 }
附加信息
错误可能与以下内容有关:
https://github.com/Automattic/mongoose/issues/2457
你实际上已经非常接近解决方案了,创建索引时你需要使用它:
partialFilterExpression: { serialNr: {$exists:true} }
确保至少有 3.2 版本 mongo
示例:
db.col.createIndex({a:1, b:1},{unique:true, partialFilterExpression: { a: {$exists:true} })
db.col.save({a:50, b:27}) //pass
db.col.save({a:50, b:27}) //fails
db.col.save({b:27}) //pass
db.col.save({b:27}) //pass
db.col.save({b:27}) //pass
db.col.save({a:50, b:27}) //fails
db.col.save({a:50}) //pass
db.col.save({a:50}) //fails
PS :也许你可以做一点 "hack" 并使用它:partialFilterExpression: { serialNr: {$exists:true}, serialNr: {$gte:0} }
我尝试使用 $ne,但出现错误。
我想创建一个索引,以确保在 manufacturer
+ art
的组合中没有重复的 serialNr
。但是有些项目没有 serialNr
。这些我不想check/index.
代码
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 文档指出,如果复合索引中缺少某个字段,则不应为其编制索引:
Sparse indexes selects documents to index solely based on the existence of the indexed field, or for compound indexes, the existence of the indexed fields. 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 }
附加信息
错误可能与以下内容有关: https://github.com/Automattic/mongoose/issues/2457
你实际上已经非常接近解决方案了,创建索引时你需要使用它:
partialFilterExpression: { serialNr: {$exists:true} }
确保至少有 3.2 版本 mongo
示例:
db.col.createIndex({a:1, b:1},{unique:true, partialFilterExpression: { a: {$exists:true} })
db.col.save({a:50, b:27}) //pass
db.col.save({a:50, b:27}) //fails
db.col.save({b:27}) //pass
db.col.save({b:27}) //pass
db.col.save({b:27}) //pass
db.col.save({a:50, b:27}) //fails
db.col.save({a:50}) //pass
db.col.save({a:50}) //fails
PS :也许你可以做一点 "hack" 并使用它:partialFilterExpression: { serialNr: {$exists:true}, serialNr: {$gte:0} }
我尝试使用 $ne,但出现错误。