Mongodb mongo中的稀疏索引和空值
我不确定我是否正确理解稀疏索引 我在fbId上有一个稀疏的唯一索引Mongodb mongo中的稀疏索引和空值,mongodb,indexing,mongodb-indexes,Mongodb,Indexing,Mongodb Indexes,我不确定我是否正确理解稀疏索引 我在fbId上有一个稀疏的唯一索引 { "ns" : "mydb.users", "key" : { "fbId" : 1 }, "name" : "fbId_1", "unique" : true, "sparse" : true, "background" : false, "v" : 0 } 我希望这样可以插入fbId为null的记录,但这会引发重复密钥异常。它只允许我在fbI
{
"ns" : "mydb.users",
"key" : {
"fbId" : 1
},
"name" : "fbId_1",
"unique" : true,
"sparse" : true,
"background" : false,
"v" : 0
}
我希望这样可以插入fbId为null的记录,但这会引发重复密钥异常。它只允许我在fbId属性被完全删除时插入
稀疏索引不应该处理这个问题吗?稀疏索引不包含缺少索引字段的文档。但是,如果字段存在且值为
null
,则仍将对其进行索引。因此,如果应用程序中缺少字段及其与null
相等,并且希望保持fbId
的唯一性,只需在有值之前插入它即可
当您有大量文档时,您需要稀疏索引,但其中只有一小部分包含某个字段,并且您希望能够通过该字段快速查找文档。创建普通索引的成本太高,您只会在索引您不感兴趣的文档时浪费宝贵的RAM。为了确保索引的最大性能,我们可能希望在索引那些不包含您正在执行索引的字段的文档时省略。为此,MongoDB具有稀疏属性,其工作原理如下:
db.addresses.ensureIndex( { "secondAddress": 1 }, { sparse: true } );
此索引将省略所有不包含secondAddress字段的文档,并且在执行查询时,将永远不会扫描这些文档
让我分享这篇关于基本索引及其一些属性的文章:
地理空间、文本、哈希索引以及唯一和稀疏属性:
假设我们希望在上述文档上创建一个索引。在a
和b
上创建索引不会有问题。但是如果我们需要在c
上创建一个索引呢。唯一约束对c
键不起作用,因为两个文档的空值重复。这种情况下的解决方案是使用sparse
选项。此选项告诉数据库不要包含遗漏键的文档。相关的命令是db.collectionName.createIndex({thing:1},{unique:true,sparse:true})
。稀疏索引也让我们使用更少的空间
请注意,即使我们有一个sparse
索引,数据库也会执行所有文档扫描,尤其是在进行排序时。这可以在解释
结果的获胜计划部分中看到
ensureIndex自MongoDB 3.0以来一直被弃用,因此请使用createIndex。从MongoDB 3.2开始,MongoDB提供了创建部分索引的选项。部分索引提供了稀疏索引功能的超集。
{a:1, b:5, c:2}
{a:8, b:15, c:7}
{a:4, b:7}
{a:3, b:10}