我有一个分片集合,带有分片键"用户ID"。我想执行一个查询,而不是传递分片键,我只是将查询限制为只有本地mongos分片上的数据。
这可能/可取吗?
此外,它可以与findAndModify一起使用吗?这将允许我对本地文档执行原子更新,而无需在查询中指定分片键。
修改 如下面的一些答案和评论中所述,我对mongos与mongod的理解有点偏差。我现在感谢mongos没有保存本地数据。
答案 0 :(得分:1)
mongos
是否有任何"本地"数据?没有。每个mongos
守护进程routes queries to your shards并不存储任何数据,因此没有" local"由mongos
存储的文档。 mongos
接口提供整个分片群集的逻辑视图,并且与特定分片没有亲缘关系。
根据您发送给mongos
的查询/命令类型,查询将为:
没有。技术上可能直接从分片中读取数据,但绝对不值得推荐,因为您可以获得不一致的数据视图。例如,如果正在进行迁移,则数据将暂时存在于供体分片和目标分片上。同样,由于迁移失败,文档副本可能是orphaned。
通过mongos
的查询可以正确地将查询定向到相应的分片,并根据sharded cluster metadata过滤结果。
findAndModify()
吗?没有。对于分片收藏,findAndModify()
requires a query based on the shard key。分片键可以保证所请求的文档仅存在于一个分片上。
mongos
的情况下更新分片集合?没有。对分片集合的所有更新都必须经过mongos
。
答案 1 :(得分:0)
请注意,这样做是不明智的,因为到共享群集的流量应该通过mongos服务。
话虽如此,如果您在分片实例上本地执行查询,则可以查询分片本身。
我从来没有试过以编程方式做到这一点,但它可能值得一试
您可以直接登录运行分片的计算机,并在那里打开一个mongo shell(如果您从未在其上创建本地用户/密码,我相信您可以在没有凭据的情况下连接,否则,该特定分片上的mongod进程必须拥有自己的用户/通行证(因为通过mongos创建的那些在mongod分片中无法识别。
由于每个分片仅知道自己的数据文件,例如,您将在其中一个集合上运行count()操作,您将看到结果只是实际集合大小的一部分。
答案 2 :(得分:0)
你混淆英语后,你的问题有点模糊:
我只是将查询限制为仅限本地mongos分片上的数据。
该分片实际上是一个mongod
进程,而不是mongos
进程,但是如果每个分片都有一个mongos
,那么你的英语就有意义了,在这种情况下你有意义想直接发送到可以查询其本地mongos
数据的分片上的mongod
。
如果您正考虑绕过mongos
,那么@Stennies评论会回答您的问题,但如果您的英语意味着其他内容,那么我不相信mongos
有一个命令切换允许您直接目前没有分片键的查询。