programing

Azure DocumentDb에서 레코드 수 가져오기

topblog 2023. 6. 2. 20:03
반응형

Azure DocumentDb에서 레코드 수 가져오기

azure 사이트의 documentdb에서 허용하는 SQL 쿼리와 documentdb 탐색기(https://studiodocumentdb.codeplex.com/) 는 지원되지 않습니다.현재까지 제가 찾은 레코드 카운트를 얻는 유일한 방법은 코드(아래 참조)입니다.하지만, 지금은 이것이 충돌하고 있기 때문에 우리의 컬렉션에는 충분한 파일이 있습니다.내 솔루션보다 더 많이 작동하는 컬렉션의 문서 수를 계산할 수 있는 방법이 있습니까?

DocumentClient dc = GetDocumentDbClient();
var databaseCount = dc.CreateDatabaseQuery().ToList();
Database azureDb = dc.CreateDatabaseQuery().Where(d => d.Id == Constants.WEATHER_UPDATES_DB_NAME).ToArray().FirstOrDefault();

var collectionCount = dc.CreateDocumentCollectionQuery(azureDb.SelfLink).ToList();

DocumentCollection update = dc.CreateDocumentCollectionQuery(azureDb.SelfLink).Where(c => c.Id == "WeatherUpdates").ToArray().FirstOrDefault();

var documentCount = dc.CreateDocumentQuery(update.SelfLink, "SELECT * FROM c").ToList();

MessageBox.Show("Databases: " + databaseCount.Count().ToString() + Environment.NewLine
                +"Collections: " + collectionCount.Count().ToString() + Environment.NewLine
                + "Documents: " + documentCount.Count().ToString() + Environment.NewLine, 
                 "Totals", MessageBoxButtons.OKCancel); 

이것은 2017년에 가능합니다.

SELECT VALUE COUNT(1) FROM c

[ 1234 ]

이 시점에서 실제로 작동합니다.

SELECT COUNT(c.id) FROM c

이것은 당신이 지금 SQL 쿼리를 쓰는 것과 같은 방법으로 가능합니다.

SELECT VALUE COUNT(1) FROM myCollection

여기에 이미지 설명 입력

참고: COUNT(1)은 대규모 데이터 세트에서는 작동하지 않습니다.

지원되는 쿼리에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

"count" 키워드가 구현될 때까지 서버의 스토어 절차에서 쿼리를 수행해야 합니다.카운트만 원하는 경우 쿼리에 있는 모든 열/속성을 가져오지 않도록 주의하십시오.

좋아요 ID만 선택합니다.

  dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")

요약하자면, 다음은 JS를 통한 저장 프로시저 카운트(Count Stored Procedure)의 예이며, 계속 지원이 제공됩니다.

DocumentDb를 위한 도구가 하나 더 있습니다. https://github.com/mingaliu/DocumentDBStudio/releases .

2017년 3월 업데이트: 최신 DDB SDK에서 DDB Aggregates 보도 자료를 참조하십시오. 단, GROUP BY 없이 기본 Aggregate를 완전히 지원합니다(현재는).를 들어 다음과 같은 GIT Repo가 있습니다. https://github.com/arramac/azure-documentdb-dotnet/tree/master/samples/code-samples/Queries

단일 파티션에 20만 개의 엔티티가 있는 분할된 Document db 컬렉션에 대해 테스트를 수행했습니다.Collection은 10K RU/초로 구성됩니다.

클라이언트 측 쿼리:

  1. "SELECT VALUE COUNT(1) FROM c"

경과 시간(ms): 2471밀리초 총 요청 사용 단위: 6143.35

참고: 이것이 가장 빠르고 저렴한 옵션입니다.그러나 클라이언트 측에서 계속을 처리하고 반환된 계속 토큰을 사용하여 다음 쿼리를 실행해야 합니다. 그렇지 않으면 부분적인 결과/카운트를 얻을 수 있습니다.

  1. "SELECT COUNT(c.id) FROM c"

경과시간(ms): 2589 총 RU: 6682.43

참고: 이것은 매우 가깝지만 약간 느리고 더 비쌉니다.

서버 측 / 저장 프로시저:

  1. 저장 프로시저가 필요한 경우 다음과 같이 제공됩니다. https://github.com/Azure/azure-cosmosdb-js-server/blob/master/samples/stored-procedures/Count.js

하지만 그것은 문제가 있다는 것을 조심하세요.카운트를 계산하기 위해 내부적으로 컬렉션/파티션의 모든 문서를 읽습니다.결과적으로 그것은 훨씬 더 느리고 훨씬 더 비쌉니다!

경과 시간(ms): 8584 밀리초 총 RU: 13419.31

  1. 성능 향상을 위해 위 링크에 제공된 저장 프로시저를 업데이트했습니다.아래의 전체 업데이트된 Count.js.업데이트된 저장 프로시저는 원본보다 훨씬 빠르고 저렴한 성능을 제공하며 최상의 성능을 발휘하는 클라이언트 측 쿼리(위의 #1)와 동등합니다.

경과 시간(ms): 2534밀리초 총 RU: 6298.36

function count(filterQuery, continuationToken) {
    var collection = getContext().getCollection();
    var maxResult = 500000; 
    var result = 0;

    var q = 'SELECT \'\' FROM root';
    if (!filterQuery) {
        filterQuery = q;
    }

    tryQuery(continuationToken);

    function tryQuery(nextContinuationToken) {
        var responseOptions = { continuation: nextContinuationToken, pageSize: maxResult };

        if (result >= maxResult || !query(responseOptions)) {
            setBody(nextContinuationToken);
        }
    }

    function query(responseOptions) {
        return (filterQuery && filterQuery.length) ?
            collection.queryDocuments(collection.getSelfLink(), filterQuery, responseOptions, onReadDocuments) :
            collection.readDocuments(collection.getSelfLink(), responseOptions, onReadDocuments);
    }

    function onReadDocuments(err, docFeed, responseOptions) {
        if (err) {
            throw 'Error while reading document: ' + err;
        }

        result += docFeed.length;

        if (responseOptions.continuation) {
            tryQuery(responseOptions.continuation);
        } else {
            setBody(null);
        }
    }

    function setBody(continuationToken) {
        var body = { count: result, continuationToken: continuationToken };
        getContext().getResponse().setBody(body);
    }
}

현재 존재하지 않습니다.저도 비슷한 시나리오가 있었는데, 결국 문서가 추가되거나 삭제될 때마다 업데이트되는 문서 속성에 카운터를 추가했습니다.원자성을 원하는 경우 저장 절차의 일부로 또는 트리거로 이 두 단계를 수행할 수도 있습니다.

내 코드 수 솔루션도 작동 중입니다...일단 내가 방금 id를 Papa Ours가 지적한 것처럼 선택한 후 :) 나의 원래 게시물을 작동시키려면, 이 줄을 바꾸세요:

var documentCount = dc.CreateDocumentQuery(update.SelfLink, "SELECT * FROM c").ToList();

다음 줄로:

var documentCount = dc.CreateDocumentQuery(update.SelfLink, "SELECT id FROM c").ToList()

저장 프로시저에 대한 아이디어는 여전히 documentdb 스튜디오에서 작동할 것이기 때문에 마음에 듭니다(정말 멋진 프로젝트 :)) - https://studiodocumentdb.codeplex.com/

Id = IdValue의 레코드 수를 찾는 방법

SELECT COUNT(1) FROM c where c.Id = <IdValue>

언급URL : https://stackoverflow.com/questions/27745346/get-record-count-in-azure-documentdb

반응형