でMongoDBのコレクションのために、私は、製品のこのコレクションを持っていると私は私が何をしたいのか、カスタムソート関数に基づいてtop 10 products
は、カスタムの並べ替え流星
[{ _id: 1, title, tags:['a'], createdAt:ISODate("2016-01-28T00:00:00Z") } ,
{ _id: 2, title, tags:['d','a','e'], createdAt:ISODate("2016-01-24T00:00:00Z") }]
を表示する」に基づいて、それを並べ替えることですマジックスコア "を計算することができます。たとえば、次の式に基づいて:tag_count*5 - number_of_days_since_it_was_created
。
最初のものは、1日齢である場合、これはスコアを行います
[{_id:1 , score: 4}, {_id:2, score: 10}]
特に以来、私はこれを実現する方法についていくつかのアイデアを持っていますが、私は彼らがどのように良いかわかりません私はモンゴや流星の両方に新たなんだ:
- 、オブザーバー(Meteor.observe)とドキュメントが が変更されるたびに(または作成新しいものを)開始し、スコアを再計算し、それを上 を更新
コレクション自体。もし私がこれを行うと、私はちょうど$ orderBy 私はそれが必要な使用することができます。
いくつか読んだ後、私はそのMongoの集合体を発見したり をmap_reduce私は同じ結果を達成するのを助けることができますが、私の知る限りが分かったとして、 流星が直接
それをサポートしていないソートのコレクション配列が、私はそれが改ページでどのように動作するかわからないんだけど、この メソッドを使用して、クライアント側
実行時にこれを行う唯一の方法は、他の方法でサーバー側をソートする関数を提供できないためです(mapReduceは、計算フィールド上のページングには適していません)。要件を指定する代わりに、フィールドを格納し、毎日それを再計算するだけです(また、更新時にも)。それは単純なスケジュールされたタスクであり、次に既に存在するフィールドの基本的なソートです。また、そのようにパフォーマンスが向上します。 –
それでは、製品のアップデートごとにイベントリスナーを追加するのではなく、ちょっとだけcronを実行する必要がありますか?正直言って、それは理にかなっています、特に私はスコアがリアルタイムである必要はないからです。これを行う方法は、 'cursor.each()'を使うべきでしょうか、それとも良い方法がありますか?私はmongodbでこのようなことができるかどうかは分かっていません。 "UPDATE products SET score = tags_count * 10" 'ここで私は他人の値に基づいてフィールドを設定します。ありがとう@ BlakesSeven –
それはアイデアだった。お客様の要件には「日数」と記載されているため、リアルタイムに必要なようには聞こえません。あらかじめ計算したものを保存することは、確かにここに行く方法のようです。 –