【问题标题】:Cosmos SDK returns empty results on a query without partition specifiedCosmos SDK 在未指定分区的查询上返回空结果
【发布时间】:2021-04-16 18:10:22
【问题描述】:

.Net Cosmos SDK 在未指定分区的查询中返回空结果。 提供分区键时工作正常。

我错过了什么吗?

迭代代码:

            var iterator = this.cosmosLinqQuery.GetFeedIterator(querable);

            var results = new List<Entity>();

            while (iterator.HasMoreResults)
            {
                var result = await iterator.ReadNextAsync();

                results.AddRange(result.Resource);
            }

            return results;

用于创建可查询的代码:

        var options = new QueryRequestOptions()
        {
            PartitionKey = PartitionKey.None,
            MaxItemCount = null,
            MaxConcurrency = -1,
            MaxBufferedItemCount = -1,
            EnableScanInQuery = true,
        };

        IQueryable<Entity> queryable = container.GetItemLinqQueryable<Entity>(
            requestOptions: options,
            continuationToken: continuationToken,
            allowSynchronousQueryExecution: true);

【问题讨论】:

  • 您使用的是什么版本的 SDK?旧版本默认禁用跨分区查询。
  • 排空所有页面后结果是否为空?还是您看到有些页面是空的?

标签: .net azure-cosmosdb


【解决方案1】:

我认为问题在于在此处的查询选项中将 PartitionKey 值设置为 PartitionKey.None

    var options = new QueryRequestOptions()
    {
        PartitionKey = PartitionKey.None,
        MaxItemCount = null,
        MaxConcurrency = -1,
        MaxBufferedItemCount = -1,
        EnableScanInQuery = true,
    };

根据我的理解,您使用PartitionKey.None 来获取没有分区键的文档(完全可以创建没有分区键的文档)。来自文档here

返回的对象代表一个分区键值,允许 创建和访问没有分区键值的文档

您可以尝试从查询请求选项中删除PartitionKey = PartitionKey.None 吗?比如:

var options = new QueryRequestOptions()
{
    MaxItemCount = null,
    MaxConcurrency = -1,
    MaxBufferedItemCount = -1,
    EnableScanInQuery = true,
};

那么你应该能够获取容器中的所有文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2021-03-18
    • 2021-11-20
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多