Cosmos DB扇出查询问题

时间:2018-03-16 04:02:20

标签: c# azure-cosmosdb

我最近开始将我们的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,
                            }
                        );

1 个答案:

答案 0 :(得分:1)

等待一段时间后,从Azure Cosmos数据库团队回复。我现在明白为什么我的扇出查询不起作用。我所要做的就是稍微更改一下代码,以确保它会一直查找数据直到结束,然后用结果或没有结果挽救。为了让它工作,我改变了下面的代码

PTRACE_SYSCALL

使用代码

PTRACE_EVENT_STOP