2017-06-29 53 views
2

当我们从更改源中的文档Db中获取数据时,我们只希望每个分区都尝试添加PatitionKey到代码中。基于分区的Azure更改源和查询

do 
     { 
      FeedResponse<PartitionKeyRange> pkRangesResponse = await client.ReadPartitionKeyRangeFeedAsync(
       collectionUri, 
       new FeedOptions 
       { 
        RequestContinuation = pkRangesResponseContinuation, 
        PartitionKey = new PartitionKey("KEY"), 
       }); 

      partitionKeyRanges.AddRange(pkRangesResponse); 
      pkRangesResponseContinuation = pkRangesResponse.ResponseContinuation; 
     } 
     while (pkRangesResponseContinuation != null); 

它返回一个范围,当我们去进行第二次查询

IDocumentQuery<Document> query = client.CreateDocumentChangeFeedQuery(
       collectionUri, 
       new ChangeFeedOptions 
       { 
        PartitionKeyRangeId = pkRange.Id, 
        StartFromBeginning = true, 
        RequestContinuation = continuation, 
        MaxItemCount = -1, 
       }); 

它返回所有来自所有分区的结果。有没有办法限制单个分区的结果?

+0

根据这一[artilce](https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed#a- idrest-with-the-rest-api-and-sdk),CreateDocumentChangeFeedQuery方法将从分区范围获得结果,我们不能仅仅限制单个分区的结果。 –

+0

那么从这个建议,变更饲料只能通过中介服务器支持,而不是直接由客户支持?由于客户端可能无法访问其他分区数据? – user1932923

+0

在我看来,中介服务器也是一个客户端。更改订阅源用于更改对Azure Cosmos DB数据所做的更改。 azure documentdb服务器仅支持分区范围跟踪。所以我们只能使用分区范围。 –

回答

1

Changefeed在PartitionKey Range级别工作。

什么是分区键范围?

文档Db当前有10 GB物理分区。 您指定的分区键是逻辑分区键。 文档Db使用散列在内部将此逻辑分区密钥映射到物理分区。 所以它可能是一堆逻辑分区共享相同的物理分区。 因此,为这些散列的范围分配了一个物理分区。

允许从更改供稿中读取的最小颗粒是分区密钥范围。 因此,您将不得不查询您感兴趣的分区的分区键范围ID。然后查询Changefeed以找到该范围ID,并筛选出与分区ID无关的数据。

注意:如果特定分区已满,文档db将透明地创建新的物理分区。因此,给定逻辑分区的分区键范围ID可能随时间而改变。

此链接解释了这个良好的细节: https://docs.microsoft.com/en-us/azure/cosmos-db/partition-data#partitioning-in-azure-cosmos-db