如果某些文档没有作为索引一部分的字段怎么办?

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]"
            ]
        }
    }
}