2013-04-17 3 views
5

個別:私はMongoDBのコレクションにこれらのアイテムを持っている()、スキップで使用されるコマンド()とlimit()

{x: 1, y: 60, z:100} 
{x: 1, y: 60, z:100} 
{x: 1, y: 60, z:100} 
{x: 2, y: 60, z:100} 
{x: 2, y: 60, z:100} 
{x: 3, y: 60, z:100} 
{x: 4, y: 60, z:100} 
{x: 4, y: 60, z:100} 
{x: 5, y: 60, z:100} 
{x: 6, y: 60, z:100} 
{x: 6, y: 60, z:100} 
{x: 6, y: 60, z:100} 
{x: 7, y: 60, z:100} 
{x: 7, y: 60, z:100} 

私はxの別個の値を照会する(すなわち[1、2、3 、4,5,6,7])...しかし私はそれらの一部だけを望んでいます(スキップ(a)と制限(b)で得ることができるものに似ています)。

MongoDBのjavaドライバ(または可能であればspring-data-mongodb)を使ってどうすればよいですか?モンゴシェルで

答えて

8

は、集約フレームワークと簡単です:

db.collection.aggregate([{$group:{_id:'$x'}}, {$skip:3}, {$limit:5}]) 

Javaの一見のために:use aggregation framework in java

1

あなたのユースケースに応じて、あなたが集約よりもパフォーマンスがあることをこのアプローチを見つけることができます。ここにmongoシェルのサンプル関数があります。

function getDistinctValues(skip, limit) { 

    var q = {x:{$gt: MinKey()}}; // query 
    var s = {x:1};    // sort key 

    var results = []; 

    for(var i = 0; i < skip; i++) { 
     var result = db.test.find(q).limit(1).sort(s).toArray()[0]; 
     if(!result) { 
      return results; 
     } 
     q.x.$gt = result.x; 
    } 

    for(var i = 0; i < limit; i++) { 
     var result = db.test.find(q).limit(1).sort(s).toArray()[0]; 
     if(!result) { 
      break; 
     } 
     results.push(result.x); 
     q.x.$gt = result.x; 
    } 

    return results; 

} 

私たちは、基本的には我々はすでに見てきた過去の値をスキップするクエリやソートを使用して、一度に値1を見つけています。関数をより柔軟にするために引数を増やすことで、これを簡単に改善することができます。また、固有の値を探したいプロパティーに索引を作成すると、パフォーマンスが向上します。

「スキップ」フェーズをすべてスキップしてから続行する値を指定することはあまり明らかではありません。ここにmongoシェルのサンプル関数があります。

function getDistinctValues(limit, lastValue) { 

    var q = {x:{$gt: lastValue === undefined ? MinKey() : lastValue}}; // query 
    var s = {x:1};    // sort key 

    var results = []; 

    for(var i = 0; i < limit; i++) { 
     var result = db.test.find(q).limit(1).sort(s).toArray()[0]; 
     if(!result) { 
      break; 
     } 
     results.push(result.x); 
     q.x.$gt = result.x; 
    } 

    return results; 

} 

集計手法を使用する場合は、$グループステージの後に$ソートステージを追加してください。そうしないと、結果は予測可能な順序で表示されません。

+0

これはパフォーマンスが悪い場合です。 1集約リクエストの代わりに、 'limit'リクエストをdbに送信します。 – Rayz

関連する問題