2014-11-09 2 views
8

제공된 .NET 클라이언트 라이브러리를 통해 DocumentDB 쿼리 요청을 수행 할 때 "청구 금액"을받을 수 있는지 알아 내려고합니다. 세부 사항은 Fiddler 등을 통해 모니터링 할 수있는 기본 HTTP 헤더 "x-ms-request-charge"로 돌아 오지만 .NET을 통해 직접 가져올 수있는 경우 선호합니다..NET을 통한 쿼리 당 DocumentDB 요청 요금 결정

누구에게이 작업을 수행 했습니까? 아니면 단순히 가능하지 않은지 적어도 확인할 수 있습니까?

업데이트 : 다른 작업을 쿼리를 수행하지 때 요청 충전 후 해요

추가의 설명.

답변

10

.Net 라이브러리를 통해이를 가져올 수 있어야합니다. 예를 들어 Create New User 작업의 응답을 보여주는 아래 스크린 샷을 살펴보십시오. 결과는 RequestCharge이라는 속성이있는 Microsoft.Azure.Client.ResourceResponse<T> 유형입니다.

enter image description here

UPDATE는 그래서 쿼리 결과를 확인하고 당신이 닷넷 라이브러리에 직접 노출되지 않도록 맞아요. 그러나이 ResponseHeaders 특성에서 사용할 수 있습니다 그리고 당신은 아마도 다음과 같은 것을 사용하여 알아낼 수 : 대신 피들러에서 검사의

FeedResponse<Microsoft.Azure.Documents.Document> queryResult = await documentClient.CreateDocumentQuery<Microsoft.Azure.Documents.Document>(collectio‌​nSelfLink, query, options).AsDocumentQuery().ExecuteNextAsync<Microsoft.Azure.Documents.Document>(‌​); 
var requestCharge = queryResult.ResponseHeaders["x-ms-request-charge"]; 

.

참고

ExecuteNextAsync는 연속 토큰과 결과의 하위 집합을 반환 할 수 있습니다. 모든 결과를 원한다면 문서 DB가 연속 토큰을 보내지 않을 때까지 반복해야합니다.

var docDbQueryable = documentClient.CreateDocumentQuery<Document>(collectio‌​nSelfLink, query, options).AsDocumentQuery(); 
var docDbResults = new List<Document>(); 
do 
{ 
    var batchResult = await docDbQueryable.ExecuteNextAsync<Document>(‌​);; 
    docDbResults.AddRange(batchResult); 
} 
while (docDbQueryable.HasMoreResults); 
return docDbResults; 
+0

아, 어쩌면 좀 더 명확해야합니다. 나는 특히 "CreateXYZ"가 아닌 질문에 대해 말하고 있었다. 나의 나쁜 것은 나의 원래 질문을 수정할 것이다. –

+0

죄송합니다! 사실 그것은 나빴다 :). 원래 질문에서 검색어를 언급했습니다. 어쨌든, 해결 방법을 사용하여 내 대답을 업데이트했습니다. HTH. –

+0

전혀 보지 못합니다. 이것은 DocumentClient.CreateDocumentQuery() 호출을 통해 이루어진다. 너는 다른 것을 시도해 봤어? –

4

다음은 각 쿼리에 대한 비용을 기록하고 또한 페이징을 처리 할 필요가있는 작업은 다음과 같습니다

public async Task<IEnumerable<T>> Query<T>(string databaseId, string collectionId, SqlQuerySpec sqlQuery, int take) 
where T : Resource 
{ 
    double queryCost = 0; 
    const int maxPageSize = 100; 

    var query = _client.CreateDocumentQuery<T>(
     UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), 
     sqlQuery, 
     new FeedOptions() {MaxItemCount = Math.Min(maxPageSize, take)}).AsDocumentQuery(); 

    var response = await query.ExecuteNextAsync<T>(); 
    queryCost += response.RequestCharge; 
    var entities = response.ToList(); 

    while (entities.Count < take && query.HasMoreResults) 
    { 
     var nextResponse = await query.ExecuteNextAsync<T>(); 
     queryCost += nextResponse.RequestCharge; 
     entities.AddRange(nextResponse); 
    } 

    Debug.WriteLine(
     "Query [{0}] for {1} documents in collection [{2}] cost {3} RUs.", 
     sqlQuery.QueryText, 
     take, 
     collectionId, 
     queryCost); 

    return entities.Take(take).ToList(); // We may end up with more than the requested number of items. 
}