[英]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.