获取 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
我在分片集群中有两个副本集,文档按 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