2017-09-06 3 views
0

シナリオ:のMongoDB /帆を見つける():改ページと異なるレコード

ドキュメントを降順にソート20のページ限界、によってフェッチされる必要があります。 返される結果は一意である必要があります(ID、タイトルなど、プロパティに基づいて)

ページ1のアイテムAは2ページに重複を持つ可能性があると考えてください。

このような状況を処理できるクエリはありますか?

Sailsの釣り糸では不可能だと思われますが、mongoのネイティブコールがこれを解決できるかどうかは疑問です。

+0

mongoのユニークな意味は?あなたがユニークなタイトルを探していて、同じタイトルのプロパティを持つ5つのレコードがある場合は、最初のレコードを取るか?別のプロパティのいくつかの並べ替えを行うか?また、ページ2の重複が何を意味しているのかもわかりません。それはどのようにして一意性を備えていますか? – arbuthnott

+0

同じタイトルの.byページを持つ2つのドキュメントがあるとしましょう。私は結果を20としましょう。ここで問題となるのは、最初の結果セットで、次の20の結果に同じタイトルの別のドキュメントがあることがわかっているドキュメントがあるとします。 2番目の文書がスキップされていることを確認するにはどうしたらいいですか?また、この文書を除外した後でも、まだ20個の文書を取得して送信できることを確認してください。 –

答えて

0

私はここでmongoがあなたがしたいことをすることはできないと思います。 mongoのdistinctコマンドを使用して、コレクション全体またはクエリの結果全体にわたって特定のプロパティの個別の値を取得できます(そして、セイルは.nativeを介して生のモンゴクエリを公開します)。

ただし、これは、識別性のある単一のプロパティだけでなく、代表オブジェクト全体を必要とする場合には役立ちません。また、特定の数の異なる値が保証されている方法で照会することもできません。

私はあなたがコードでこの仕事をしなければならないと強制するでしょう。 1つの醜い方法は、20以上の異なる値を合理的に確かめるために「十分以上の」レコード(30〜100?)をフェッチし、20回までループを突き抜けてページを作成することです。上の並び替え(これは、そのフィールドでも一意のフィールドであるか、ない場合は、我々は明確なタイトルを望ん例えばフィールドtitlepopularity()、とコレクションのために。

例API呼び出しをうまくいく、とpopularity DESCによってソートされています:

getMoreRecords: function(req, res) { 
    var foundTitles = req.param('foundTitles'); // an array of titles we already have 
    var lowestPop = req.param('lowestPop'); // the lowest popularity already retrieved 
    Record.find({ 
     title: {'!': foundTitles}, 
     popularity: {'<': lowestPop} 
    }).limit(100).sort('popularity DESC').exec(function(err, records) { 
     // do the error handling... 
     var filteredRecords = records.filter(function(rec, idx, arr) { 
      return arr.indexOf(rec) === idx; 
     }); 
     // filteredRecords is guaranteed to contain records with unique, unseen titles in popularity desc order 
     // it could contain any number however 
     return res.json(filteredRecords.slice(0,20)); 
    }); 
} 

これは全てのタイトルは、すべての新しいページのためにサーバにすでに見つかっ返送が必要です(このコードは、いくつかのコントローラのmodule.exportsはになります)ことを避けるために、あなたができました。このクライアント側のいくつかを行うが、ますます複雑になる。

一般的には、「十分以上」のレコードをクライアント側(複数ページのような)に保ち、さらに必要なときに、場合によっては数ページ後に照会することをおすすめします。そして、私がここに示したように、サーバーではなく、既に見たタイトルのクライアント側のフィルタリングを行います。

+0

ええ、私はちょうど同じことを考えました。必要以上のレコードを取り込み、除外しました。私のために働く!ありがとう! –

+0

今私はmongoと仕事関連の研究をしています。私は私の答えに急いで話したかもしれません。生のモンゴークエリはグループ化(https://docs.mongodb.com/manual/reference/operator/aggregation/group/)と最初の代理人(https://docs.mongodb.com)を利用できる演算子をサポートしているようです/ manual/reference/operator/aggregation/first /)を参照してください。あなたはまだ水線でそれを使用することはできませんが、あなたは生のmongoの質問に進むことができます。 – arbuthnott

関連する問題