MongoDB 计数部分索引的项目

MongoDB count partially indexed items

我有一个集合的部分索引,看起来有点像这样:

{ // Fields
    "Name" : 1
}
{ // Options
    "unique" : true,
    "name" : "Name_1",
    "partialFilterExpression" : {
        "IsArchived" : {
            "$eq" : true
        }
    }
}

我只想计算已被此部分索引索引的项目数,只是为了检查它是否正常工作。有没有办法做到这一点?还是有另一种好方法来检查部分索引索引了哪些内容?

MongoDB 不支持在获取索引文档详细信息的意义上检查索引的内容。

但是,您可以简单地 运行 使用与索引中相同的过滤器对您的集合进行查询,以获取索引文档:

db.collection.find({ "IsArchived": { "$eq": true } })

另外,如果你想得到计数,你可以在最后添加.count()

db.collection.find({ "IsArchived": { "$eq": true } }).count()

为了查看您的索引是否被使用,您可以 运行 例如以下查询:

db.collection.find({ "Name": "index check", "IsArchived": true }).explain()

如果索引被使用(应该是这种情况),那么发出上述语句应该在 "winningPlan" 字段内的某处打印类似这样的内容:

"inputStage" : {
    "stage" : "IXSCAN",
    "keyPattern" : {
        "Name" : "index check"
    },
    "indexName" : "<your index name>"

如果它打印出这样的内容,那么索引就不会被使用:

    "winningPlan" : {
        "stage" : "COLLSCAN",

我刚刚意识到我有点厚。因为我使用的是 "unique" 标志,所以我还可以通过将项目插入到具有相同名称的集合中来测试索引。换句话说,对于索引:

{ // Note: using IsArchived: false instead of true
    "unique" : true,
    "name" : "Name_1",
    "partialFilterExpression" : {
        "IsArchived" : {
            "$eq" : false
        }
    }
}

我应该得到以下插入这些项目的结果:

{ // Success
    "Name" : "test1",
    "IsArchived" : false
}

{ // Failure
    "Name" : "test1",
    "IsArchived" : false
}

{ // Success
    "Name" : "test1",
    "IsArchived" : true
}