[英]Cosmos DB fan out query issue
我最近开始将CosmosDB单个分区集合移动到新的逻辑分区集合。 我在“阶段”中执行此操作,在“阶段”中,我已经介绍了在事务支持下的所有创建和更新操作。 目前,我将对所有读取操作展开查询,并将在未来几周内解决此问题。 但是,在当前情况下,查询中存在一个问题。 下面是使用C#LINQ选择的代码示例,然后我将通过几个步骤向您解释我的问题
不带分区键的代码
using (var query = _client.CreateDocumentQuery<User>(_documentCollectionUri,
new FeedOptions { EnableCrossPartitionQuery = true })
.Where(u => u.Email == emailAddress.ToLower())
.AsDocumentQuery())
{
if (query.HasMoreResults)
{
var response = await query.ExecuteNextAsync<User>();
return response.FirstOrDefault(); //always returning null
}
}
return null;
现在,在上面的代码中,未启用跨分区查询的情况下未提供分区键,它将进入if块内,但始终返回null。 为确保我已在集合中获取数据,我通过执行query.ToString()检查了客户端查询,并在Azure DB资源管理器中运行了查询,该查询可以正常工作并返回记录,但在我的代码中始终返回null上面的内容告诉我客户端出了点问题,或者不适用于跨分区查询。
带分区键的代码
using (var query = _client.CreateDocumentQuery<User>(_documentCollectionUri,
new FeedOptions { EnableCrossPartitionQuery = true, PartitionKey = new PartitionKy(“myemail@email.com”) })
.Where(u => u.Email == emailAddress.ToLower())
.AsDocumentQuery())
{
if (query.HasMoreResults)
{
var response = await query.ExecuteNextAsync<User>();
return response.FirstOrDefault(); //always returning null
}
}
return null;
现在,上面给出的代码可以正常工作。
获取客户端实例的代码如下
_client = new DocumentClient
(
new Uri(Configuration["azureSettings:documentDb:endPoint"]),
Configuration["azureSettings:documentDb:key"],
_jsonSerializerSettings,
new ConnectionPolicy
{
EnableEndpointDiscovery = false,
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Microsoft.Azure.Documents.Client.Protocol.Tcp,
}
);
等待一会儿并从Azure Cosmos DB团队回复。 我现在知道为什么我的扇出查询不起作用。 我要做的就是稍微更改代码,以确保它将一直在寻找数据,直到最后,然后以结果还是没有结果来解决。 因此,为了使其正常工作,我更改了以下代码
if (query.HasMoreResults)
{
var response = await query.ExecuteNextAsync<User>();
return response.FirstOrDefault(); //always returning null
}
用代码
var results = new List<MyClass>();
while(query.HasMoreResults)
{
results.AddRange(await query.ExecuteNextAsync<MyClass>());
}
return results.FirstOrDefault(x => x.MyProp== propValue.ToLower());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.