Arrays mongodb忽略数组索引上的稀疏
使用mongo 4.4.3,我将在数组中创建一个唯一且稀疏的索引:Arrays mongodb忽略数组索引上的稀疏,arrays,mongodb,indexing,Arrays,Mongodb,Indexing,使用mongo 4.4.3,我将在数组中创建一个唯一且稀疏的索引: db.test.createIndex( { "array": 1 }, { unique: true, sparse: true } ) 我用一些测试数据填充它: db.test.insert({}) db.test.insert({array:[]}) db.test.insert({array:[ "a" ]}) db.test.insert({array:[ "b&qu
db.test.createIndex( { "array": 1 }, { unique: true, sparse: true } )
我用一些测试数据填充它:
db.test.insert({})
db.test.insert({array:[]})
db.test.insert({array:[ "a" ]})
db.test.insert({array:[ "b" ]})
db.test.insert({array:[ "c", "d" ]})
现在,我预计会出现以下情况:
db.test.insert({array:[ "a" ]}) #FAIL
db.test.insert({array:[ "b" ]}) #FAIL
db.test.insert({array:[ "c" ]}) #FAIL
db.test.insert({array:[ "d" ]}) #FAIL
db.test.insert({}) #SUCCESS
db.test.insert({array:[]}) #SUCCESS
相反,我得到的是:
db.test.insert({array:[ "a" ]}) #FAIL
db.test.insert({array:[ "b" ]}) #FAIL
db.test.insert({array:[ "c" ]}) #FAIL
db.test.insert({array:[ "d" ]}) #FAIL
db.test.insert({}) #SUCCESS
db.test.insert({array:[]}) #FAIL
问题是:
"E11000 duplicate key error collection: db.test index: array_1 dup key: { array: undefined }"
空数组似乎被视为未定义的
——但为什么会忽略稀疏呢
有没有一种方法可以获得我期望的行为(而不影响性能)?使用
部分索引仅对集合中满足指定筛选器表达式的文档进行索引。通过索引集合中文档的子集,部分索引具有更低的存储需求,并降低了索引创建和维护的性能成本
选项1
db.test.createIndex(
{ "array": 1 },
{ unique: true, partialFilterExpression: { "array": { $gt: [] } } }
)
仅当数组是gt[]
时,使用partialFilterExpression:{“array”:{$gt:[]}
选项2
db.test.createIndex(
{ "array": 1 },
{ unique: true, partialFilterExpression: { "array.0": { $exists: true } } }
)
“array.0”:{$exists:true}
将检查数组索引0是否可用,即数组是否有一些值。谢谢!当使用这样的部分索引时,您是否意识到任何性能差异?@tcurdt使数组唯一性非常完美,但您不能在查询和排序中利用这一点。详情请参阅-