MongoDBカーソルとページング

2214 ワード

説明:この記事では主にMongoDBにおけるカーソル(cursor)の使用とskip()とlimit()関数を用いたページングについて説明し、最後にsort()関数のソートについて説明します.
MongoDBカーソル(cursor)
カーソルとは、ResultSet(javaのデータオブジェクト)のデータ処理に非常に類似したデータが1行で操作できることを意味します.MongoDBではカーソルの処理も簡単で、find()関数を使用するだけでカーソルを返すことができます.
カーソルの宣言
//     
var cursor = db.collection.find({});

//            
cursor.hasNext();

//         
cursor.next()

例:ループを使用した操作
var obj;
var cursor = db.collection.find();
while( cursor.hasNext() ){
    obj = cursor.next();
    // todo 
    ...
}

例:javaScriptのforEach反復データの使用
var obj;
var cursor = db.collection.find();
cursor.forEach(function(item){
    // todo
    ...
})

カーソルのライフサイクル
カーソルは一定のメモリとリソースを消費します.次に、カーソルが使用するリソースを解放します.
  • カーソルループ完了後
  • クライアントは、終了メッセージ
  • を送信する.
  • カーソルが10分以上使用されていない
  •  
    MongoDBページング
    MongoDBページングで使用する2つの関数limit()とskip()は、ソートが必要な場合はsort()関数を使用できます.
    limit:          ,      
    skip:          ,              ,       
    sort:           ,             !

    Limit()とskip()の使用
    例:前の50のデータのみをクエリー
    db.collection.find().limit(50);

    例:前の50のデータをスキップ
    db.collection.find().skip(50);

    sort()関数の使用
    ソートするにはsortを使用します.対応するkey値は1リットル、-1は降順です.
    例:価格priceで上位から下位にソートします.
    db.collection.find().sort({price: 1});

    例:priceとnameの両方のフィールドを使用して昇順ソート
    db.collection.find().sort({price: 1, name: 1});

    ページング実装
    1つ目の方法:データ量が少ない場合に使用できます.
    //         
    db.test.find().sort({"price":1}).limit(20);
    
    //         
    db.test.find().sort({"price":1}).limit(20).skip(20);
    
    //           
    db.test.find().sort({"price":1}).limit(20).skip(40);
    ...

    第2の方式:skip()関数は比較的資源を消費するため、以下の方式はskip()操作を避ける.
    //        
    var page1 = db.test.find().sort({"price":1}).limit(20);
    var latest ;
    //           
    while( page1.hasNext() ){
        latest = page1.next();
    }
    
    //         
    db.test.find({"price": {"$gt": latest.price}  }).sort({"price":1}).limit(20);

    このような操作では、現在記録されている値を記録し、その値より大きいデータを取得するたびにskip()関数を使用することを避け、効率が高くなります.