我最近开始将我们的CosmosDB单分区集合移动到新的逻辑分区集合。我在Phases中这样做,我已经在事务的支持下完成了所有的创建和更新操作。 现在,我将展示所有读取操作的查询,我将在未来几周内解决这个问题。但是,在我当前的场景中,我在查询中遇到了一个问题。下面是我使用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,
}
);
答案 0 :(得分:1)
等待一段时间后,从Azure Cosmos数据库团队回复。我现在明白为什么我的扇出查询不起作用。我所要做的就是稍微更改一下代码,以确保它会一直查找数据直到结束,然后用结果或没有结果挽救。为了让它工作,我改变了下面的代码
PTRACE_SYSCALL
使用代码
PTRACE_EVENT_STOP