首页 > 解决方案 > 获取 mongodb 中给定分片键值的分片 ID

问题描述

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

有没有办法查询哪个分片(副本集)包含给定文档(通过_id或分片键字段)而不在客户端重新实现分片键散列

标签: mongodbshardingreplicaset

解决方案


您可以使用查询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

推荐阅读