如果某些文档没有作为索引一部分的字段怎么办?
What if some documents don't have a field that is part of an index?
一个集合有一个索引涉及 field_A
。但是 field_A
不是必需的。那么如果有些文档没有这个字段会怎样呢?索引是否仍适用于具有此字段的文档?
是的,索引将适用于具有可用字段和索引的文档,但您可以查看创建 sparse or partial 类型索引的选项,这些索引在某些情况下会添加一些额外的优化...
P.S。
在缺少索引字段的文档的常规索引中,这被视为 null value ... ,因此如果您按 field_A: null 搜索,您会发现缺少该字段的文档和等于 null 的文档。 ..
是的,这是一个测试:
db.collection.createIndex({ field_A: 1 });
for (let i = 0; i < 100; i++)
db.collection.insertOne({ field_B: i });
db.collection.stats(1024).indexSizes
{ "_id_" : 20, "field_A_1" : 20 }
您看到索引 field_A_1
的大小为 20 KB。此行为不同于大多数关系型 DBMS 数据库,在这些数据库中,此类索引的大小为零。
索引也被你的查询使用,如果你使用字段:
db.collection.find({ field_B: 1 }).explain().queryPlanner.winningPlan;
{
"stage" : "COLLSCAN",
"filter" : {
"field_B" : {
"$eq" : 1
}
}
}
db.collection.find({ field_A: null, field_B: 1 }).explain().queryPlanner.winningPlan;
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field_A" : 1
},
"indexName" : "field_A_1",
"indexBounds" : {
"field_A" : [
"[undefined, undefined]",
"[null, null]"
]
}
}
}
一个集合有一个索引涉及 field_A
。但是 field_A
不是必需的。那么如果有些文档没有这个字段会怎样呢?索引是否仍适用于具有此字段的文档?
是的,索引将适用于具有可用字段和索引的文档,但您可以查看创建 sparse or partial 类型索引的选项,这些索引在某些情况下会添加一些额外的优化...
P.S。 在缺少索引字段的文档的常规索引中,这被视为 null value ... ,因此如果您按 field_A: null 搜索,您会发现缺少该字段的文档和等于 null 的文档。 ..
是的,这是一个测试:
db.collection.createIndex({ field_A: 1 });
for (let i = 0; i < 100; i++)
db.collection.insertOne({ field_B: i });
db.collection.stats(1024).indexSizes
{ "_id_" : 20, "field_A_1" : 20 }
您看到索引 field_A_1
的大小为 20 KB。此行为不同于大多数关系型 DBMS 数据库,在这些数据库中,此类索引的大小为零。
索引也被你的查询使用,如果你使用字段:
db.collection.find({ field_B: 1 }).explain().queryPlanner.winningPlan;
{
"stage" : "COLLSCAN",
"filter" : {
"field_B" : {
"$eq" : 1
}
}
}
db.collection.find({ field_A: null, field_B: 1 }).explain().queryPlanner.winningPlan;
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field_A" : 1
},
"indexName" : "field_A_1",
"indexBounds" : {
"field_A" : [
"[undefined, undefined]",
"[null, null]"
]
}
}
}