代码之家  ›  专栏  ›  技术社区  ›  Zysce myrtle303

CosmosDb c#SDK的工作方式与restapi不同

  •  0
  • Zysce myrtle303  · 技术社区  · 8 年前

    我正在使用带有nuget的CosmosDb Sdk Microsoft.Azure.DocumentDB.Core 2.1.0 具有 .NetStandard 2.0

    我正在使用此查询获取文档

    var client client = new DocumentClient(new Uri(config.CosmosDbEndPointUrl), config.CosmosDbPrimaryKey);
    var partitionKey = "siteId"; // the partition key is defined as /siteId, I tried both, still not working
    var queryOptions = new FeedOptions
    {
      MaxItemCount = 500,
      EnableCrossPartitionQuery = true,
      PartitionKey = new PartitionKey(partitionKey)
    };
    
    var auditQuery = client
        .CreateDocumentQuery<AuditDTO>(
         UriFactory.CreateDocumentCollectionUri(_databaseName, _collectionName), queryOptions)
            .Where(f => f.Status == AuditStatus.Pending)
            .AsDocumentQuery();
    
    var results = new List<AuditDTO>();
    while (auditQuery.HasMoreResults)
    {
      var audits = await auditQuery.ExecuteNextAsync<AuditDTO>();
      results.AddRange(audits);
    }
    

    此查询返回0个文档。

    我是根据 this tutorial

    this example (见注释) EXECUTE a query

    var client = new System.Net.Http.HttpClient();
    string response = string.Empty;
    string authHeader = string.Empty;
    string verb = string.Empty;
    string resourceType = string.Empty;
    string resourceId = string.Empty;
    string resourceLink = string.Empty;
    client.DefaultRequestHeaders.Add("x-ms-date", utc_date);
    client.DefaultRequestHeaders.Add("x-ms-version", "2017-02-22");
    
    verb = "POST";
    resourceType = "docs";
    resourceLink = $"dbs/{databaseId}/colls/{collectionId}/docs";
    resourceId = (idBased) ? $"dbs/{databaseId}/colls/{collectionId}" : collectionId.ToLowerInvariant();
    
    authHeader = GenerateMasterKeyAuthorizationSignature(verb, resourceId, resourceType, masterKey, "master", "1.0");
    
    client.DefaultRequestHeaders.Remove("authorization");
    client.DefaultRequestHeaders.Add("authorization", authHeader);
    client.DefaultRequestHeaders.Add("x-ms-documentdb-isquery", "True");
    client.DefaultRequestHeaders.Add("x-ms-documentdb-query-enablecrosspartition", "true");
    client.DefaultRequestHeaders.Add("x-ms-partition-key", "[\"siteId\"]");
    
    var qry = new SqlQuerySpec { query = "SELECT * FROM root WHERE (root[\"status\"] = 0)" };
    var r = await client.PostWithNoCharSetAsync(new Uri(baseUri, resourceLink), qry);
    var s = await r.Content.ReadAsStringAsync();
    

    使用restapi返回1个我期望的文档。

    我试图反序列化对AuditDTO类的响应,它可以工作,因此,我的模型没有问题。

    我错过了什么?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Nick Chapsas    8 年前
    var partitionKey = "siteId";
    var queryOptions = new FeedOptions
    {
      MaxItemCount = 500,
      EnableCrossPartitionQuery = true,
      PartitionKey = new PartitionKey(partitionKey)
    };
    

    你的问题出在分区键上。

    这意味着 partitionKey FeedOptions 应该是这个样子 59c49da3-b398-4db7-aff4-d2129353e3a8 (假设是guid)不是这个 siteId .

    正确的FeedOptions对象如下所示:

    var partitionKey = "59c49da3-b398-4db7-aff4-d2129353e3a8";
    var queryOptions = new FeedOptions
    {
      MaxItemCount = 500,
      EnableCrossPartitionQuery = true,
      PartitionKey = new PartitionKey(partitionKey)
    };
    
        2
  •  0
  •   Zysce myrtle303    8 年前

    这些文件确实有误导性。

    EnableCrossPartitionQuery

    var queryOptions = new FeedOptions
    {
      MaxItemCount = 500,
      EnableCrossPartitionQuery = true
    };
    

    正如Nick Chapsas所说,如果需要搜索特定的分区,请设置 PartitionKey 属性设置为要搜索的分区的值。

    这里是 a sample 我在Azure GitHub上找到的。