Golang 및 MongoDB의 빠르고 효율적인 페이지 매김

3268 단어 apigowebdev
MongoDB는 문서 기반 데이터 저장소이므로 페이지 매김은 가장 일반적인 사용 사례 중 하나입니다. 그렇다면 언제 응답을 페이지로 나누나요? 대답은 꽤 깔끔합니다. 청크로 결과를 처리하고 싶을 때마다 페이지를 매깁니다. 몇 가지 일반적인 시나리오는 다음과 같습니다.
  • 일괄 처리
  • 사용자 인터페이스에 방대한 결과 세트 표시

  • 클라이언트 측과 서버 측의 페이지 매김은 비용이 매우 많이 들기 때문에 고려해서는 안 됩니다. 따라서 페이지 매김은 일반적으로 데이터베이스 수준에서 처리되며 데이터베이스는 이러한 요구 사항에 최적화되어 있습니다.
    2 approaches through which you can easily paginate your MongoDB responses. Sample Document
     {
            "_id" : ObjectId("6936d17263623919cd5145db"),
            "name" : "Neeraj Kumar",
            "age" : 25
        }
    


    접근법 1: cursor.skip 및 cursor.limit 사용
    MongoDB 커서에는 페이징을 쉽게 만드는 두 가지 방법이 있습니다. 그들은
  • 커서.건너뛰기()
  • 커서.제한()

  • skip(n)은 커서에서 n개의 문서를 건너뛰고 limit(n)은 커서에서 반환할 문서 수를 제한합니다. 따라서 두 가지의 조합은 자연스럽게 응답을 페이지 매김합니다.In Mongo Shell your pagination code looks something like
     // Page 1
        db.students.find().limit(10)
    
        // Page 2
        db.students.find().skip(10).limit(10)
    
        // Page 3
        db.students.find().skip(10).limit(10)
    

    implement pagination:
    func GetPagination(limit, page int) error {
      ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second)
      defer cancel()
       coll := o.db.Database(mongoDatabaseName).Collection(offerCollectionName)
    
       l := int64(limit)
         skip := int64(page * limit - limit)
         fOpt := options.FindOptions{Limit: &l, Skip: &skip}
    
         curr, err := coll.Find(ctx, bson.D{{}}, &fOpt)
       if err != nil {
          return result, err
       }
    
       for curr.Next(ctx) {
          var el Offer
          if err := curr.Decode(&el); err != nil {
             log.Println(err)
          }
    
          result = append(result, el)
       }
    
       return result, nil
    }
    
    
    


    접근법 2: _id 및 limit 사용

    이 접근 방식은 _id의 기본 인덱스와 ObjectId의 특성을 효과적으로 사용합니다. Mongodb ObjectId가 다음을 포함하는 12바이트 구조라는 것을 몰랐을 것입니다.

    ObjectId의 이 속성을 사용하고 _id가 항상 인덱싱된다는 사실을 고려하여 다음과 같은 페이지 매김 접근 방식을 고안할 수 있습니다.
  • 데이터베이스에서 문서 페이지 가져오기
  • 페이지의 마지막 문서의 문서 ID를 가져옵니다
  • .
  • 해당 ID보다 큰 문서 검색

  •     // Page 1
        db.students.find().limit(10)
    
        // Page 2
        last_id = ...  # logic to get last_id
        db.students.find({'_id': {'$gt': last_id}}).limit(10)
    
        // Page 3
        last_id = ... # logic to get last_id
        db.students.find({'_id': {'$gt': last_id}}).limit(10)
    



    func GetPagination(limit, page int)  error {
        ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second)
      defer cancel()
    
       coll := o.db.Database(mongoDatabaseName).Collection(offerCollectionName)
       ctx, _ := context.WithTimeout(context.Background(), contextTimeout)
    
       curr, err := coll.Find(ctx, bson.D{{}}, newMongoPaginate(limit,page).getPaginatedOpts())
       if err != nil {
          return result, err
       }
    
       for curr.Next(ctx) {
          var el Offer
          if err := curr.Decode(&el); err != nil {
             log.Println(err)
          }
    
          result = append(result, el)
       }
    
       return result, nil
    }
    
    

    좋은 웹페이지 즐겨찾기