2016-07-12 7 views
0

私は投票&票を持っています。私はトップ投票(投票が最も多い投票)を並べ替えたいと思います。 これは私のスキーマです:マングースを参考にして並べ替え

pollSchema = Schema ({ 
    ... 
}; 

voteSchema = Schema ({ 
    ... 
    poll: { type: Schema.ObjectId, ref: "Poll" }, 
    user: { type: Schema.ObjectId, ref: "User" } 
}; 

だから、基本的には、各投票それが属するポーリングにポイントではなく、他の方法で回避(シングル「真実のソース」を保つために)。
(なぜなら、私が投票している投票をサブ文書として保持しない理由は、投票が投票者を参照する必要があるからです)。

私は、すべての投票を並べ替える簡単な方法を見つけるのに苦労しています。どの投票がそれらを指しているのか(基本的には投票の投票数による並べ替え投票です)。

は勿論、ハードな作業の方法(擬似コード)があります:

- find all polls (Poll.find({})) 
- count all votes to each poll and keeping it in a counter on each poll object (Vote.count({ poll: polls[i].id })) 
- sort the polls like a regular javascript array 

これは勿論動作するはずですが、私は1つのが存在する場合は、より良い方法を探しています。 mongooseにnewbの種類があるので、私はドキュメントを読んで何かを見逃しているかもしれません。

答えて

1

私が正しく理解している場合、各プールが受け取った投票数を返すことを望みますか?

これを実現するには、Mongoアグリゲーションhttps://docs.mongodb.com/manual/reference/method/db.collection.aggregate/を使用し、これをMoongoseに変換します。あなたのケースでは

、あなたのコードは次のようになります。これは _id があなたの投票とが得票数を表します表しますあなたの配列を返します

Vote.aggregate([ 
    {$group: {_id: "$poll", "votes": {$sum: 1}}}, 
    {$sort: {"votes": -1}}, 
    {$lookup: {from: "polls", localField: "_id", foreignField: "_id", as: "pollObject"}} //from is the name of table in database 
]) 

。配列は投票数の降順でソートされます。 $ lookupは配列を返しますので、それを抽出する必要があります。

+0

閉じる。そのアイデアの代わりに全投票オブジェクトを取得する方法はありますか?そうでなければ、これはまだ非常に有用ですので、ありがとう! –

+0

新しいバージョンのMongo(3.2など)を使用している場合は、方法があります。アップデートの回答を参照してください。 –

+0

恐ろしい!ありがとう。投票をどのようにフィルタリングすることができますか?私は定期的に 'polls.find({title: 'bla'})'を実行するので、あなたが指定したコードに 'find'を渡すとうまくいくのでしょうか? –

関連する問題