2016-05-30 4 views
0

私は、ユーザーによって作成された多数の投稿を持っています。ユーザーが下にスクロールすると、私はこれらの投稿の20を追加して、無限のスクロールのようにページにプッシュします。特定のIDより古い文書を取り出す方法は?

は、これを実現するために、私がロードされた最後の記事のIDよりも古いドキュメントを取得する必要があります。

Post.find({"_id": {"$gt": myLastId}}).limit(20).sort({"created": -1}).exec(function(err, posts) {...} 

を、論理的に、私は私のポストIDのすべてのGUIDによって生成されるため、この作業を見ることはできませんが:

私は私のアプリでマングースを使用しています

ので、これは、私はそれを書くだろうかですモンゴース(例えば、574c255db7fdb529fb38c5ab)。

投稿は全く同じ時刻に作成されることはほとんどありませんが、属性(デフォルトではDate.now()が作成されています)を使用できますか?

これ以外の唯一の方法は、indexをスキーマ内に作成して、0からインターラプトすることです。次の20個の投稿は、渡されたものよりも古いものがindexです。これは良いアプローチですか、それとももっと良い方法ですか?

答えて

1

{"_id": {"$gt": myLastId}}とあなたのアプローチは、実際に罰金です。 MongoDB IDは作成時間をエンコードします。そのため、これが機能します。 (docsおよびthis explanatory blogを参照してください。)

インクリメンタルインデックスを追加するには、コレクションレベルのロックが必要です。そのため、多数の書き込みで問題になる可能性があります。

+0

Zachさん、ありがとう、ありがとう! – Fizzix

0

他のページング機能と同じように扱いますか?すなわち、ページインデックス、resultsPerPage変数を保持し、検索した後にページインデックスをスキップして更新するか、または次のリクエストのためにクライアント側に更新するかを計算する。

私はネイティブの一例ですので、ここでマングースを使用しないでください。このような

collection.find({}).limit(resultsPerPage).skip(resultsPerPage*(page-1)) 

か何か、あなたがアイデアを得る必要があります。しかし、大きなスキップを避けるべきですが、私はこの質問が最適化に関するものだとは思いません。

+0

誰かがそのページを見ている間に新しい 'posts'が作成されたらどうなりますか?例えば、最初の20件の結果を見ていれば、2件目の20件の結果に新しい「投稿」が作成されて最初のロットの 'posts'が含まれていないのでしょうか? – Fizzix

+1

はい、あなたはそれについて正しいです!私は、O'Reillyの「MongoDB:The Definitive Guide」に記載されているこの正確な要件を見てきましたが、私は職場でそれを持っていません。あなたが質問が今夜までに答えられなかったなら、私はそこに言及された解決策であなたに戻ってきます。 – RobbyD

+0

すみません、私は昨日これに戻りません。しかし、O'Reillyの本は、あなたが現在持っている正確なアプローチをかなり示唆しています。それは、日付で明示的な並べ替えを使用していることを除いて、私はかなりObjectIDがあなたの現在のコードで問題に実行されないほど唯一のものだと確信しています。 – RobbyD

関連する問題