복붙노트

[MONGODB] 정렬 된 페이징 주어진 레코드에 대한 값을 생략 계산

MONGODB

정렬 된 페이징 주어진 레코드에 대한 값을 생략 계산

나는 PHP 드라이버를 사용하여 몽고 DB 컬렉션의 특정 레코드에 대한 건너 뛰기 값을 계산하기 위해 노력하고있어. 주어진 기록을 복용 그래서, 전체 컬렉션에서 그 기록의 색인을 찾을 수 있습니다. 이것이 가능한가?

현재 내가 모든 레코드를 선택하고있어 수동으로 결과의 배열의 인덱스를하고.

해결법

  1. ==============================

    1.이것은 결과 "분류"사용할 때 당신은 "앞으로"방향으로 결과를 통해 "효율적으로 페이지"로 사용할 수있는 개념이다 "앞으로 페이징"라고합니다.

    이것은 결과 "분류"사용할 때 당신은 "앞으로"방향으로 결과를 통해 "효율적으로 페이지"로 사용할 수있는 개념이다 "앞으로 페이징"라고합니다.

    (이것은 쉘에서 작동하기 때문에)하지만, 번역하는 것은 어렵지 않아 자바 스크립트 로직이 포함되어 있습니다.

    일반적으로 개념 :

    { "_id": 1, "a": 3 },
    { "_id": 2, "a": 3 },
    { "_id": 3, "a": 3 },
    { "_id": 4, "a": 2 },
    { "_id": 5, "a": 1 },
    { "_id": 6, "a": 0 }
    

    페이지 당 "이"항목에서 "페이지"에 우리가 원하는 결과의 예로서 (편의를 위해) 그 "이미 정렬"문서를 생각해 보자.

    첫 번째 인스턴스에서 당신은 같은 것을 할 :

    var lastVal = null,
        lastSeen = [];
    
    db.collection.find().sort({ "a": -1 }).limit(2).forEach(function(doc) {
        if ( lastVal != doc.a ) {
            lastSeen = [];
        }
        lastVal = doc.a;
        lastSeen.push( doc._id );
        // do something useful with each document matched
    });
    

    이제 그 lastVal 및 lastSeen 어디 있지 유사한 다른 웹 응용 프로그램, 또는 무언가의 관점에서 다음 요청에 액세스 할 수 있습니다보다 "세션 변수"와 같은 당신이 뭔가에 저장하는 것이 있습니다.

    그들이 비록 포함해야하면에 정렬 된 맨 마지막 값과 그 값이 변경되지 않았기 때문에 볼 수 있었다 "독특한"_id 값 목록입니다. 금후:

    lastVal = 3,
    lastSeen = [1,2];
    

    요점은 "다음 페이지"에 대한 요청이 주변에 올 때 다음과 같은 뭔가를 그 변수를 사용하고자하는 것입니다 :

    var lastVal = 3,
        lastSeen = [1,2];
    
    db.collection.find({ 
        "_id": { "$nin": lastSeen }, 
        "a": { "$lte": lastVal }
    }).sort({ "a": -1 }).limit(2).forEach(function(doc) {
        if ( lastVal != doc.a ) {
            lastSeen = [];
        }
        lastVal = doc.a;
        lastSeen.push( doc._id );
        // do something useful with each document matched
    });
    

    무엇을 모든 결과가 있어야합니다 "보다 작거나 같음"는 lastVal가 정렬 기록 (내림차순) 있는지 확인 모든 결과 목록에서 lastSeen에 기록됩니다 _id 값뿐만 아니라 메이크업을 "제외"입니다 필드 "A".

    이 컬렉션의 다음 두 결과를 얻을 수 :

    { "_id": 3, "a": 3 },
    { "_id": 4, "a": 2 },
    

    그러나 처리 한 후 우리의 가치는 지금과 같이 :

    lastVal = 2,
    lastSeen = [4];
    

    그래서 지금 논리는 "보다 작거나 같음"있는 lastVal 만 "한"이 때부터 "A"보다 당신은 정말 값을 찾고 있기 때문에 전에 본 다른 _id 값을 제외 할 필요가 없습니다 다음 그 값에서 볼 _id 값 만 하나를 제외합니다.

    물론 이것은 단지 위와 동일한 코드를 사용하여 다음 페이지를 산출한다 :

    { "_id": 5, "a": 1 },
    { "_id": 6, "a": 0 }
    

    즉 일반적으로 결과를 통해 "앞으로 페이지"에 가장 효율적인 방법입니다 결과 "분류"의 효율적인 페이징에 특히 유용합니다.

    당신이 어떤 단계에서 20 페이지 또는 유사한 행동 "점프"를 원하는 그러나 다음이 당신을 위해하지 않습니다. "계산"이것에 다른 합리적인 방법이 없기 때문에 당신은 "페이지 번호"하여이 작업을 수행 할 수 있도록 기존의 .skip () 및으로 제한 할 () 접근 붙어 있습니다.

    그것은 그래서 모든 응용 프로그램이 "페이징"그리고 당신이 살 수를 구현하는 방법에 따라 달라집니다. .skip () 및으로 제한 할 () 접근 방식은 "건너 뛰기"여기에 방법을 사용하여 피할 수의 성능을 겪고있다.

    당신이 "페이지로 이동"을 원하는 경우에 당신이 결과를 "캐시"를 구축하고자하지 않는 반면에, 다음 "건너 뛰는 것은"당신의 유일한 옵션입니다. 그러나 그것은 또 다른 문제는 전적으로입니다.

  2. from https://stackoverflow.com/questions/31242867/calculate-skip-value-for-given-record-for-sorted-paging by cc-by-sa and MIT license