0

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

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

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

4

2 回答 2

1

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",
于 2017-11-29T20:22:50.830 回答
0

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

{ // 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
}
于 2017-11-29T22:12:50.697 回答