- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到一个问题,如果我为特定查询指定分区键,我将获得我期望的记录。但是,如果我不指定分区键并将 EnableCrossPartitionQuery 设置为 true,它将不会返回/查找任何文档。
这实际上在我的一个 Cosmos DB 上按预期工作,但在另一个 Cosmos DB 上则不然。相同的记录/文件。
我正在使用以下设置
Microsoft.Azure.DocumentDB NuGet 包版本 2.3.0
具有无限容量的 Cosmos DB 集合(PartitionKey =应用程序ID)
关于数据库/集合的三个非常简单的文档,通过 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
}
有什么想法为什么这行不通吗?
最佳答案
你的代码是错误的。您的错误在于此检查:
if (queryData.Any())
您在实际取回所有数据之前就已返回。
您的代码使用分区键的原因是因为您的目标是一个物理分区(通过逻辑分区)并且包含的数据小于您提供的 MaxItemCount 或 RequestOptions
对象。
Cosmos DB 仅返回分页结果,并且需要调用每个物理分区来获取这些值,有时会多次调用每个分区,在某些情况下,迭代可能返回 0 数据,但下一次可能会返回一些数据。您必须 ExecuteNextAsync
直到 HasMoreResults
为 false。
添加一个 while 循环来从跨分区查询将命中的所有物理分区获取所有分页结果将解决该问题:
这是代码:
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;
}
关于azure - 使用 EnableCrossPartitionQuery 的 CosmosDB CreateDocumentQuery 不会返回结果,但如果指定 PartitionKey 则会返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55778672/
我有这个方法: /// /// Gets a list of our documents /// /// public List List(string query) { // Retu
为什么没有 CreateDocumentQuery 的异步版本? 这个方法例如可以是异步的: using (var client = new DocumentClient(new Uri(en
我在azure documentDB平台上用c#开发。我尝试在我的应用程序中实现分页架构。我的代码: var userQuery = _client.CreateDocumentQuery(
我正在尝试让 Cosmos DB .NET SDK v1.19.1 使用 Json.net 序列化设置自动将对象反序列化为正确的类型。除了在查询文档时,这似乎工作正常。以下面的代码为例: pu
我正在尝试查询具有某种类型产品的 Art。这是我的艺术模型: public string Title { get; set; } public string Description { get
我正在为下面的代码编写单元测试,它使用带有 where(filter) 条件的文档客户端 CreateDocumentQuery 方法。 var documentQuery = ReadOnlyDo
我有一个解决方案,问题是为什么会发生这种情况以及这是否是一个好的解决方案。背景:在 Azure DocumentDb 中,我有一个托管哈希,它使用一个集合对数据库进行分区。CLR 对象继承自 Docu
我正在尝试检索存储在我的 Azure DocumentDb 中的单个实体。我发现我的代码仅在我通过 SQL 提供查询时才有效,如下所示: var query = String.Format("SELE
首次尝试访问 Cosmos 数据库。 所有这些都位于解决方案的 DAL 项目层(n 层)中。EndPointURI、PrimaryKey 和 DBName 由类构造函数设置。 我执行client.Cr
我遇到一个问题,如果我为特定查询指定分区键,我将获得我期望的记录。但是,如果我不指定分区键并将 EnableCrossPartitionQuery 设置为 true,它将不会返回/查找任何文档。 这实
我正在 .NET 应用程序中使用 Microsoft.Azure.DocumentDB.Core 版本 2.1.1 库来查询 Cosmos DB 中的数据。 下面是我用来从 Cosmos DB 查询数
我正在 .NET 应用程序中使用 Microsoft.Azure.DocumentDB.Core 版本 2.1.1 库来查询 Cosmos DB 中的数据。 下面是我用来从 Cosmos DB 查询数
我是一名优秀的程序员,十分优秀!