【问题标题】:Get shard id for given value of sharding key in mongodb获取 mongodb 中给定分片键值的分片 ID
【发布时间】:2019-07-16 14:53:28
【问题描述】:

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

有什么方法可以查询哪个分片(副本集)包含给定文档(通过_id 或分片键字段),而无需在客户端重新实现分片键散列

【问题讨论】:

  • 您是要查找散列分片键的值,还是要询问有关查找给定文档所在的分片的更一般的问题?您可以编辑您的问题,并提供更多有关您正在寻找的内容以及您正在使用的 MongoDB 的特定版本的信息吗?用于查询的散列分片键和分片的答案可以在解释计划输出中找到。例如:db.users.find({userId:123}).explain().queryPlanner.winningPlan。 MongoDB 4.0+ shell 还有一个convertShardKeyToHashed() 助手。
  • @Stennie 其“关于查找给定文档所在的分片的问题”,将在回来工作时尝试convertShardKeyToHashed
  • 在这种情况下,您不需要convertShardKeyToHashed(),因为可以通过解释输出更直接地找到分片名称。用于查询散列分片键值的解释输出中的 indexBounds 也将指示散列值。

标签: mongodb sharding replicaset


【解决方案1】:

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

【讨论】:

  • 嗨@Stennie...我有一个问题。我的数据库中有 2000 万条记录,这是我的查询 mongoplayground.net/p/zsQ_lmnUr3z。正如您在输出中看到的那样,它给了我一个字段data。现在,每 2000 万条记录都是不同的。我需要使用 data 字段进行排序,并且需要找到前 5 条记录。我可以对动态字段进行索引吗?如果这个问题有答案,我肯定会提出一个问题
  • @AnthonyWinzlet 这最好作为一个单独的问题讨论,包括您的用例的更多详细信息(服务器版本、所需的输出以及遇到的任何错误/问题)。无法在同一管道中索引计算字段,但您可以将 agg 结果输出到具有索引的集合。注意:如果您的目标只是在添加一些计算值后获得第一个 n 匹配项,则有一个 $sort + $limit memory optimisation 因此只保留顶部的 n 项。
  • 嗨,Stennie 请看一下stackoverflow.com/questions/54630076/…
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 2021-07-14
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2013-04-29
  • 2013-03-26
  • 2014-11-06
相关资源
最近更新 更多