Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays mongodb忽略数组索引上的稀疏_Arrays_Mongodb_Indexing - Fatal编程技术网

Arrays mongodb忽略数组索引上的稀疏

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

使用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" ]})
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使数组唯一性非常完美,但您不能在查询和排序中利用这一点。详情请参阅-