簡體   English   中英

CosmosDb c#SDK無法與Rest Api相反地工作

[英]CosmosDb c# SDK is not working on contrary to the Rest Api

我正在將CosmosDb Sdk與nuget 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個文檔。

我的查詢基於本教程

我認為某些參數不正確,所以我嘗試使用Rest Api,基於此示例的代碼(請參閱注釋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();

我期望使用Rest Api返回1個文檔。

我試圖反序列化對類AuditDTO的響應,它可以正常工作,因此,我的模型沒有問題。

我不明白為什么Rest Api可以工作,而不是.Net Sdk。

沒有授權異常,沒有錯誤消息。 我只得到0個文檔。

我想念什么嗎?

var partitionKey = "siteId";
var queryOptions = new FeedOptions
{
  MaxItemCount = 500,
  EnableCrossPartitionQuery = true,
  PartitionKey = new PartitionKey(partitionKey)
};

您的問題出在分區鍵上。 分區鍵應該是分區鍵的值,而不是定義。

這意味着FeedOptions上的partitionKey值應類似於此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)
};

該文檔確實具有誤導性。

要啟用CrossPartition查詢以查詢所有分區,只需要將EnableCrossPartitionQuery設置為true就可以了!

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

正如Nick Chapsas所說,如果需要搜索特定的分區,請將PartitionKey屬性設置為要搜索的分區的值。

這是我在Azure GitHub上找到的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM