当前位置: 首页 > 知识库问答 >
问题:

CosmosDB 创建文档使用启用交叉分区查询不返回结果,但如果指定分区键,则会返回结果。

詹正浩
2023-03-14

我有一个问题,如果我为一个特定的查询指定分区键,我将得到我期望的记录。但是,如果我没有指定分区键,只是将EnableCrossPartitionQuery设置为true,它将不会返回/找到任何文档。

这实际上在我的一个宇宙数据库上按预期工作,但在另一个数据库上却没有。相同的记录/文档。

我正在使用以下设置:

> 微软公司。Azure.DocumentDB NuGet包版本2.3.0

具有无限容量的Cosmos DB集合(带有分区键=Application ationId)

数据库/集合上的三个非常简单的文档,通过 Azure 存储资源管理器手动创建

我的代码如下所示,相当简单。如果GetDocuments的调用者传递了partitionKey的值,那么我通过FeedOptions在查询中指定它。否则,我在FeedOptions上设置EnableCrossPartitionQuery。

数据库/集合上有效的文档与数据库/集合中无效的文档相同。

我使用相同的分区键(ApplicationId)以相同的方式创建集合

public async Task<IEnumerable<T>> GetDocuments<T>(Expression<Func<T, bool>> predicate, object partitionKey = null)
{
    IDocumentQuery<T> queryDetails = QueryDocument<T>(predicate, partitionKey);

    var queryData = await queryDetails.ExecuteNextAsync<T>();

    if (queryData.Any())
    {
        return queryData;
    }

    return default(IEnumerable<T>);
}

private IDocumentQuery<T> QueryDocument<T>(Expression<Func<T, bool>> predicate, object partitionKey = null)
{
    FeedOptions feedOptions;

    if (partitionKey == null)
    {
        feedOptions = new FeedOptions { EnableCrossPartitionQuery = true };
    }
    else
    {
        feedOptions = new FeedOptions { PartitionKey = new PartitionKey(partitionKey) };
    }

    var query = _client.CreateDocumentQuery<T>(DocumentCollectionUri, feedOptions);

    var queryDetails = query.Where(predicate).AsDocumentQuery();

    return queryDetails;
}

文档如下所示:

{
"id": "1",
"HubName": "abxyz-hub",
"ClientId": "abxyz",
"ApplicationId": 1,
"ApplicationName": "My App Name",
"_rid": "hSkpAJde99IBAAAAAAAAAA==",
"_self": "dbs/hSkpAA==/colls/hSkpAJde99I=/docs/hSkpAJde99IBAAAAAAAAAA==/",
"_etag": "\"53007677-0000-0100-0000-5cbb3c660000\"",
"_attachments": "attachments/",
"_ts": 1555774566
}

知道为什么这不起作用吗?

共有1个答案

薄瑞
2023-03-14

你的代码是错误的。你的错误在这张支票上:

if (queryData.Any())

您在实际获取所有数据之前返回。

您的代码使用分区键的原因是因为您的目标是一个物理分区(通过逻辑分区),并且包含的数据小于您提供的MaxItemCount或Request estOptions对象。

Cosmos DB 仅返回分页结果,并且它需要为这些值调用每个物理分区,有时是每个分区的多次,在某些情况下,迭代可能返回 0 数据,但下一个迭代可能有一些数据。您必须执行下一次同步,直到“更多结果”为假。

添加time循环以从跨分区查询将遇到的所有物理分区中获取所有分页结果将解决问题:

这是代码:

public async Task<IEnumerable<T>> GetDocuments<T>(Expression<Func<T, bool>> predicate, object partitionKey = null)
{
    IDocumentQuery<T> documentQuery = QueryDocument<T>(predicate, partitionKey);

    var results = new List<T>();

    while(documentQuery.HasMoreResults)
    {
        var docs = await documentQuery.ExecuteNextAsync<T>();    
        results.AddRange(docs)
    }

    return results;
}

private IDocumentQuery<T> QueryDocument<T>(Expression<Func<T, bool>> predicate, object partitionKey = null)
{
    FeedOptions feedOptions;

    if (partitionKey == null)
    {
        feedOptions = new FeedOptions { EnableCrossPartitionQuery = true };
    }
    else
    {
        feedOptions = new FeedOptions { PartitionKey = new PartitionKey(partitionKey) };
    }

    var query = _client.CreateDocumentQuery<T>(DocumentCollectionUri, feedOptions);

    var queryDetails = query.Where(predicate).AsDocumentQuery();

    return queryDetails;
}
 类似资料:
  • 我正在玩mongob,并将一些测试数据{name:"david"}输入到“用户”集合中。我通过键入mongoshell验证了数据在MongoDB中 结果: 在 node.js 脚本中,使用以下代码: 不返回任何结果 我没有发现任何错误,也没有错误。请告知

  • 我有下面的SQL查询,我在flink工作中使用。< code>mysql_table是使用JDBC连接器创建的,而< code>kafa_source表是从传入的kafka流创建的。 我在两者之间执行时态连接,当我在Flink的sql-client CLI中检查时,运行良好(用< code>flink-faker测试)。内部查询工作得非常好,并且正在打印结果。有人能帮助我找出这个问题吗? 编辑:我

  • Spark 1.3.1(也尝试了Spark 1.5.1) Hadoop 2.6(在CDH 5.4.0上) Pyspark--主纱--num--执行者5--执行者-内存10g--驱动程序-内存4g--驱动程序-核心4 database.table有超过2k个分区 database.table在field1上分区(在where子句中使用) 占用的时间不确定--我不得不停止查询的执行,因为它很快占用了我

  • 问题内容: 我有一个数据库,正在运行以下查询: 上面的查询一次返回两个结果集,我不能分别触发两个查询。如何在Java类中一次处理两个结果集? 问题答案: 正确的代码来处理JDBC语句返回的多个: 重要位: 并返回以表明语句的结果只是一个数字,而不是一个。 您需要检查以了解是否还有更多结果。 确保关闭结果集或使用

  • 问题内容: 我有以下从数据库获取十六进制代码的函数 我的问题是我在回调函数中返回了结果,但getColour函数未返回任何内容。我希望getColour函数返回的值。 在我调用getColour的那一刻,它不返回任何内容 我尝试做类似的事情 但当然SELECT查询在返回值时已经完成 问题答案: 您只需要对回调中的db查询结果进行处理。就像。

  • 我有一个简单的代码,可以从第14列开始将转置的范围复制到另一张表的最后一行 它按原样返回零结果。如果我将destrow从公式更改为simple 2(这是现在最后一个空行),则效果很好。为什么不返回目标工作表中的最后一行索引?