복붙노트

[MONGODB] 몽구스 제한 / 오프셋 및 계산 쿼리

MONGODB

몽구스 제한 / 오프셋 및 계산 쿼리

쿼리 성능에 이상한 하나의 비트 ... 나는 문서의 총 수를 수행하는 쿼리를 실행해야하고, 또한 제한 상쇄 될 수있는 결과 집합을 반환 할 수 있습니다.

그래서, 총 57 개 문서를 가지고 있고, 사용자는 (20)에 의해 상쇄 10 문서를 원한다.

내가 먼저 array.slice 그들이 원하는 문서를 반환하여, (배열로 반환) 모든 57 개 문서에 대한 쿼리입니다, 이렇게 2 가지 방법으로 생각할 수 있습니다. 두 번째 옵션은 몽고의 기본 '계산'방법을 사용하여 첫 번째는, 다음 몽고의 기본 $ 한계를 사용하여 두 번째 쿼리를 실행하고 그리 게이터를 건너 $, 2 개 쿼리를 실행하는 것입니다.

당신은 더 나은 확장 할 어떤 생각하십니까? 모두 하나 개의 쿼리에서 그 일을, 또는 두 개의 분리 된 것들을 실행?

편집하다:

// 1 query
var limit = 10;
var offset = 20;

Animals.find({}, function (err, animals) {
    if (err) {
        return next(err);
    }

    res.send({count: animals.length, animals: animals.slice(offset, limit + offset)});
});


// 2 queries
Animals.find({}, {limit:10, skip:20} function (err, animals) {            
    if (err) {
        return next(err);
    }

    Animals.count({}, function (err, count) {
        if (err) {
            return next(err);
        }

        res.send({count: count, animals: animals});
    });
});

해결법

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

    1.나는 당신이이 쿼리를 사용하는 것이 좋습니다 :

    나는 당신이이 쿼리를 사용하는 것이 좋습니다 :

    난 당신이 모든 항목을 조회하고 수행하는 것보다 것은 당신이 빅 데이터가있을 때 원인은 나중에 데이터가 전송 및 처리에 문제가있는 것, 건너 뛰고하지해야한다고 생각합니다.

  2. ==============================

    2.대신이 쿼리를 사용하는 단일 쿼리에서 집계를 사용

    대신이 쿼리를 사용하는 단일 쿼리에서 집계를 사용

    집계 "$면이"더 빨리 가져올 수 있으며, 총 개수와 스킵 및 한계와 데이터

        db.collection.aggregate([
    
          //{$sort: {...}}
    
          //{$match:{...}}
    
          {$facet:{
    
            "stage1" : [ $group:{_id:null, count:{$sum:1}} ],
    
            "stage2" : [ { "$skip": 0}, {"$limit": 2} ]
    
          }},
    
    
         {$unwind: "$stage1"},
    
          //output projection
         {$project:{
            count: "$stage1.count",
            data: "$stage2"
         }}
    
     ]);
    

    출력은 다음과 같다 : -

    [{
         count: 50,
         data: [
            {...},
            {...}
          ]
     }]
    
  3. ==============================

    3.이 문제를 스스로 해결하는 데 후, 나는 user854301의 대답에 구축하고 싶습니다.

    이 문제를 스스로 해결하는 데 후, 나는 user854301의 대답에 구축하고 싶습니다.

    몽구스 ^ 4.13.8 내가 toConstructor라는 기능을 사용할 수 있었다 () 필터가 적용되는 날 때 쿼리를 여러 번 구축을 방지 할 수있다. 나는이 기능이 너무 이전 버전에서 사용할 수 있습니다 알고 있지만이를 확인하기 위해 몽구스 문서를 확인해야합니다.

    다음은 블루 버드 약속을 사용합니다 :

    let schema = Query.find({ name: 'bloggs', age: { $gt: 30 } });
    
    // save the query as a 'template'
    let query = schema.toConstructor();
    
    return Promise.join(
        schema.count().exec(),
        query().limit(limit).skip(skip).exec(),
    
        function (total, data) {
            return { data: data, total: total }
        }
    );
    

    이제 카운트 쿼리는 일치하는 전체 레코드를 반환하고 반환 된 데이터는 전체 기록의 일부가 될 것입니다.

    쿼리를 구성한 () 주위 쿼리 ()을 유의하시기 바랍니다.

  4. ==============================

    4.당신이 모든 것을 할 것입니다 도서관이있다, 몽구스 - PAGINATE-V2 체크 아웃

    당신이 모든 것을 할 것입니다 도서관이있다, 몽구스 - PAGINATE-V2 체크 아웃

  5. from https://stackoverflow.com/questions/13935733/mongoose-limit-offset-and-count-query by cc-by-sa and MIT license