Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 查询复合密钥分片Mongo_Mongodb_Sharding_Composite Key - Fatal编程技术网

Mongodb 查询复合密钥分片Mongo

Mongodb 查询复合密钥分片Mongo,mongodb,sharding,composite-key,Mongodb,Sharding,Composite Key,我已经为mongo集合创建了一个复合碎片密钥: {目录id:1,类别id:1} 现在,如果我仅通过保证唯一的catalog_id查询集合,查询是否会转到所有碎片?在mongo db中,如果您在多个字段上有一个复合索引,您可以使用它来查询字段的开始子集。所以如果你有一个索引 a,b,c 您可以在查询中使用它 a a,b a,b,c 不确定shardng是否以同样的方式工作。通常,查询将转到包含该查询相关区块范围的任何碎片。在您的例子中,如果catalog_id确实保证是唯一的,那么对于相同的c

我已经为mongo集合创建了一个复合碎片密钥: {目录id:1,类别id:1}


现在,如果我仅通过保证唯一的catalog_id查询集合,查询是否会转到所有碎片?

在mongo db中,如果您在多个字段上有一个复合索引,您可以使用它来查询字段的开始子集。所以如果你有一个索引

a,b,c
您可以在查询中使用它

a
a,b
a,b,c

不确定shardng是否以同样的方式工作。

通常,查询将转到包含该查询相关区块范围的任何碎片。在您的例子中,如果catalog_id确实保证是唯一的,那么对于相同的catalog_id范围,您就不会有多个块(例如,您不会有一个块的范围为{catalog_id:12,category:“a”}到{catalog_id:12,category:“m”},另一个块的范围为{catalog_id:12,category:“n”}到{catalog_id:12,category:“z”},因为您只能有一个具有{catalog_id:12}的文档,并且区块范围是基于现有文档创建的)


因此,在您的情况下,查询应该转到单个碎片

它可能击中一个或几个碎片。如果catalog_id在所有服务器上,那么是的,所有服务器都可能被查询。在我的情况下catalog_id是唯一的,顺便说一句,如果catalog_id保证是唯一的,为什么要创建复合碎片密钥?是不是因为你想在{catalog_id:1,category_id:1}上建立索引?