복붙노트

[MONGODB] MongoDB의에서 페이지 매김을 구현

MONGODB

MongoDB의에서 페이지 매김을 구현

나는 매김을 구현하기 위해 건너 뛸 사용하는 나쁜 관행 것을 알고, 데이터가 메모리를 많이 소비하는 대형 건너 뛰기 시작 오면 때문이다. 이 문제를 해결하는 한 가지 방법은 _id 필드에 의해 자연 순서를 사용하는 것입니다 :

//Page 1
db.users.find().limit(pageSize);
//Find the id of the last document in this page
last_id = ...

//Page 2
users = db.users.find({'_id'> last_id}). limit(10);

문제는 - 내가 몽고에 새로 온 사람이 매우 last_id을 얻을 수있는 가장 좋은 방법이 무엇인지 모른다

해결법

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

    1.당신이에 대해 얘기하는 개념은 "앞으로 페이징"호출 할 수 있습니다. 그것을위한 좋은 이유는) .skip () 사용 및으로 제한 할 (달리이 특정 페이지에 "건너 뛰기"참으로 이전 페이지로 "위로"나에 사용할 수 없습니다 수정. 상점에 대한 노력의 큰 거래 "볼"또는 "발견"페이지와 이상하지에서 페이징 "페이지 링크"의 유형은 당신이 원하는 것입니다 그렇다면, 당신은 .skip ()와 고수 것이 가장 좋은 선택이다. 제한 () 접근 방식, 성능 단점에도 불구하고.

    당신이에 대해 얘기하는 개념은 "앞으로 페이징"호출 할 수 있습니다. 그것을위한 좋은 이유는) .skip () 사용 및으로 제한 할 (달리이 특정 페이지에 "건너 뛰기"참으로 이전 페이지로 "위로"나에 사용할 수 없습니다 수정. 상점에 대한 노력의 큰 거래 "볼"또는 "발견"페이지와 이상하지에서 페이징 "페이지 링크"의 유형은 당신이 원하는 것입니다 그렇다면, 당신은 .skip ()와 고수 것이 가장 좋은 선택이다. 제한 () 접근 방식, 성능 단점에도 불구하고.

    그것은 단지 당신에게 실행 가능한 옵션 "전진"인 경우, 여기에 기본 개념이다 :

    db.junk.find().limit(3)
    
    { "_id" : ObjectId("54c03f0c2f63310180151877"), "a" : 1, "b" : 1 }
    { "_id" : ObjectId("54c03f0c2f63310180151878"), "a" : 4, "b" : 4 }
    { "_id" : ObjectId("54c03f0c2f63310180151879"), "a" : 10, "b" : 10 }
    

    물론 3 개 항목의 한계 첫 페이지입니다 그. 코드 커서를 반복와 지금을 고려 :

    var lastSeen = null;
    var cursor = db.junk.find().limit(3);
    
    while (cursor.hasNext()) {
       var doc = cursor.next();
       printjson(doc);
       if (!cursor.hasNext())
         lastSeen = doc._id;
    }
    

    그래서 반복이 커서와는 무언가를하고, 커서의 마지막 항목에 도달 한 것은 사실 때 본 _id에 lastSeen 값을 저장 :

    ObjectId("54c03f0c2f63310180151879")
    

    이후의 반복에서 당신은 당신이 쿼리에 (세션 또는 무엇이든) 유지 _id 값이 있음을 공급 :

    var cursor = db.junk.find({ "_id": { "$gt": lastSeen } }).limit(3);
    
    while (cursor.hasNext()) {
       var doc = cursor.next();
       printjson(doc);
       if (!cursor.hasNext())
         lastSeen = doc._id;
    }
    
    { "_id" : ObjectId("54c03f0c2f6331018015187a"), "a" : 1, "b" : 1 }
    { "_id" : ObjectId("54c03f0c2f6331018015187b"), "a" : 6, "b" : 6 }
    { "_id" : ObjectId("54c03f0c2f6331018015187c"), "a" : 7, "b" : 7 }
    

    그리고 프로세스가 다시 반복 이상 더 이상의 결과를 얻을 수 없습니다 때까지.

    즉 같은 _id와 같은 자연 질서의 기본 과정입니다. 뭔가 다른 것이 좀 더 복잡한 가져옵니다. 다음을 고려하세요:

    { "_id": 4, "rank": 3 }
    { "_id": 8, "rank": 3 }
    { "_id": 1, "rank": 3 }    
    { "_id": 3, "rank": 2 }
    

    에 두 페이지가 계급으로 분류되어 있음을 분할하는 것은 다음 당신이 기본적으로 알아야 할 것은 당신이 "이미 본"그 결과를 제외 한 것입니다. 첫 페이지에서 찾고 그래서 :

    var lastSeen = null;
    var seenIds = [];
    var cursor = db.junk.find().sort({ "rank": -1 }).limit(2);
    
    while (cursor.hasNext()) {
       var doc = cursor.next();
       printjson(doc);
       if ( lastSeen != null && doc.rank != lastSeen )
           seenIds = [];
       seenIds.push(doc._id);
       if (!cursor.hasNext() || lastSeen == null)
         lastSeen = doc.rank;
    }
    
    { "_id": 4, "rank": 3 }
    { "_id": 8, "rank": 3 }
    

    다음 반복에서 당신은 덜되고 싶어하거나 lastSeen "순위"점수를 동일, 또한 그 이미 본 문서를 제외하고. 당신은 운영자 닌 $로이 작업을 수행 :

    var cursor = db.junk.find(
        { "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen }
    ).sort({ "rank": -1 }).limit(2);
    
    while (cursor.hasNext()) {
       var doc = cursor.next();
       printjson(doc);
       if ( lastSeen != null && doc.rank != lastSeen )
           seenIds = [];
       seenIds.push(doc._id);
       if (!cursor.hasNext() || lastSeen == null)
         lastSeen = doc.rank;
    }
    
    { "_id": 1, "rank": 3 }    
    { "_id": 3, "rank": 2 }
    

    얼마나 많은 "seenIds"당신이 실제로에게 유지하면 결과는 그 값이 변경 될 여기서 어떻게 "세분화"에 따라 달라집니다. 현재 "순위"점수가없는 경우이 경우 확인할 수 있습니다 lastSeen 값과 동일하고 훨씬로 성장하지 않도록 본 seenIds 내용을 폐기합니다.

    당신이 연습하고 배울 수있는 그 "앞으로 페이징"의 기본 개념을합니다.

  2. from https://stackoverflow.com/questions/28105009/implementing-pagination-in-mongodb by cc-by-sa and MIT license