首页 文章

对分区的CosmosDB集合进行查询不一致

提问于
浏览
0

我有一个分区的cosmos DB集合,它被定义为无限制,吞吐量为1000.它具有以下文档结构:

"Id": "b42129d2-5467-450c-9f7e-744f78dfe1e7", // Primary key
"ArrayOfObjects": [
 {
     // other properties omitted for brevity
     "SubId": "ed2a49fb-51d4-45b4-9690-df0721d6a32f"
 },
 {
     "SubId": "35c87833-9bea-4151-86da-4d9c482ae1fe"
 },
 "ParitionKey": "b42"

分区键是主键的前3个字母,它是GUID . 这给了我32768个可能的基数,具有良好的基数 . 我正在使用CosmosDB .NetCore SDK . 目前在~6,000个分区中有大约17万个文档 .

我有功能,我需要通过“SubId”从集合中检索文档,我不知道主键,这意味着我不知道分区键 . Unfortunatley我无法更改此功能以使用主键,因为它的依赖是一个无法修改的遗留系统 .

发生了什么,我成功创建了一个新文档,然后在某些时候我需要使用“SubId”查询该文档 . 这在C#中完成如下:

public async Task<DocumentModel> GetBySubId(string subId)
{
    var collectionId = _cosmosClient.CollectionId;
    var query = $@"SELECT * FROM {collectionId} c
                   WHERE ARRAY_CONTAINS(c.ArrayOfObjects, {{'SubId': '{subId}'}}, true)";

    var feedOptions = new FeedOptions { EnableCrossPartitionQuery = true };

    var docQuery = _cosmosClient.Client.CreateDocumentQuery(
            _collectionUri,
            query,
            feedOptions)
            .AsDocumentQuery();

    var executedQuery = await docQuery.ExecuteNextAsync<DocumentModel>();

     if (executedQuery.Count == 0)
     {
           return null;
     }

     return executedQuery.FirstOrDefault();
}

有时它成功查询有时它没有,我返回null,然后从我的控制器返回404 .

为什么这么奇怪是因为如果我检查数据库并直接运行该查询,那么文档就在那里并且实际上并没有丢失,但出于某种原因,当我使用SDK从C#查询时,它无法找到该文档 . 我有其他功能,使用主键(现在意味着我有分区键)和SubId查询,并且工作正常 . 只有当我自己使用SubId查询(没有分区键)时才能找到文档 .

鉴于上述情况,我认为它与没有分区键的查询有关 . 在没有分区键的情况下查询时我缺少什么?

我现在尝试的是将database consistency从最终设置为强 . 这似乎没有任何区别 .

1 回答

  • 1

    我目前尝试的是将数据库一致性从最终设置为强 . 这似乎没有任何区别 .

    document开始, Strong 级别的一致性保证返回项目的最新提交版本 . 根据您的描述,您正在测试的环境不是高并发读取操作 . 所以,我认为它与一致性水平无关 .

    有时它成功查询有时它没有,我返回null,然后从我的控制器返回404 .

    根据我的经验,由于吞吐量瓶颈,这个问题是反复无常的 . 查询分区集合时需要提供分区密钥 . 但是,您不知道分区键,只有在设置示例代码中已存在的 EnableCrossPartitionQuery = true 之后才能完成 . 然后,您的查询将跨越整个分区,直到找到特定文档 . 另外, array_contains 运算符增加了查询的负担 .

    Cosmos DB查询受吞吐量设置的限制,不会无休止地覆盖整个数据库 . 请参阅document .

    由于您现在无法调整分区策略,我建议您增加吞吐量设置以检查问题 .

相关问题