在DocumentDB中进行分区

时间:2016-12-27 20:11:53

标签: azure-cosmosdb

我想知道以下场景中分区partitionkey集合中的DocumentDB

  1. 集合中的每个文档C都包含两个字段:ab
  2. 使用字段Ca作为查找条件(在sql查询b子句中使用它们),必须快速查找文档where
  3. 我认为有必要以某种方式指定两个字段来完成目标2.有没有什么方法可以指定字段ab作为我的集合的分区键?

    如果没有,是否有其他解决方案?

2 个答案:

答案 0 :(得分:1)

我认为你可能在这里混淆了两个概念 - 分区和索引。

为了支持使用a和b作为标准的快速检索,您需要将这些文档编入索引。幸运的是,DocumentDB已经为您编制索引,因此您可以获得快速的性能。见https://docs.microsoft.com/en-us/azure/documentdb/documentdb-indexing

分区是一种在多个集合中分割数据(如果有很多数据)的方法,以便处理超过单个集合限制的数据。指定分区键时,具有相同键的文档将转到同一个集合。见https://docs.microsoft.com/en-us/azure/documentdb/documentdb-partition-data

那么在选择分区键时应该考虑什么逻辑?根据经验,您希望在查询中出现的文档可以在同一个集合中找到。因此,例如,如果您执行大量返回给定userId的所有文档的查询,则可能需要按用户ID进行分区。

答案 1 :(得分:1)

有两种方法可以做到这一点:

  • 选择ab(接收方)作为分区键。由于DocumentDB会自动为所有属性编制索引,因此将对单个分区执行查询。
  • 创建一个新属性,该属性是ab的连接值(例如from:a@b.com;to:c@d.com,并将其用作分区键。然后在执行查询时,将新属性包含为过滤器在你的查询中。

第二种方法比ab的查询效率更高。如果您只有a或两者(ab)混合查询,那么第一种方法会更好,因为两个查询都将针对单个分区。

但正如其他人所提到的,使用任何一种方法,或者如果你甚至选择了不同的分区密钥(如事务ID),您将获得低延迟查询响应。但对于在ab上进行过滤的查询工作负载,上述方法将是最佳选择。