获取 mongodb 中给定分片键值的分片 ID

Get shard id for given value of sharding key in mongodb

我在分片集群中有两个副本集,文档按 userId 字段分片。

有没有办法查询哪个分片(副本集)包含给定文档(通过 _id 或提交的分片密钥),而无需在客户端重新实现分片密钥散列

您可以使用查询 explain() 通过基于分片键的查询来识别文档的分片。

获胜计划应该有一个 SINGLE_SHARD 阶段,其中包含类似于以下的相等查询(为清楚起见,对一些额外的输出进行了删减):

> db.users.find({userId:123}).explain().queryPlanner.winningPlan
{
    "stage" : "SINGLE_SHARD",
    "shards" : [
        {
            "shardName" : "shard01",
            "plannerVersion" : 1,
            "namespace" : "test.users",
            "indexFilterSet" : false,
            "parsedQuery" : {
                "userId" : {
                    "$eq" : 123
                }
            },
        }
    ]
}

如果只需要分片名称,可以使用JavaScript表示法来引用完整路径:

> db.users.find({userId:123}).explain().queryPlanner.winningPlan.shards[0].shardName
shard01