2011-12-10 4 views
1

この質問は主にサニティチェックです。私はストーリーの集まりとユーザーの集まりによってDBを構成しました。各話には、その対象に投票した「有権者」の配列があります。各ユーザーには、「友人」の配列もあります。私がしたいことは、友人が投票した話だけを検索することですが、さらに、その項目に投票している友人の数でこれらを並べ替えることができるようになります。MongoDBでは、配列フィールドにユーザー名を含むストーリーのみに基づいてストーリーコレクションをクエリする方法はありますか?

私の最初の考えはこれです:ストーリーオブジェクト内の有権者のフィールドにインデックスを付ける。次に、ユーザーの文書から「友人」の配列を使用して、この索引付けされた投票者フィールド上のストーリーについてのマップを減らし、各ストーリーの出現回数をカウントするグループ化関数を使用してマップを作成しますか?それが正しいかどうかわからない。これが拡大するかどうかもわからない。思考と提案が高く評価されている。

答えて

1

私はこれが照会するのは簡単です例えば

TopStories { 
    "UserId" : ObjectId("..."), 
    "List" : [ 
       { "TotalVotes" : 200, 
       "FriendVotes" : 28, 
       "StoryName" : "test", 
       "StoryId" : ObjectId('...') 
       }, 
       { 
       /* etc. */ } 
       } 
      ] 
} 

、あなたが定期的にM/Rのクエリを実行し、あなたは非常に簡単にクエリをすることができ、コレクションに結果を格納し、バックグラウンドワーカーを使うべきだと思いますが、あまり柔軟ではありません。埋め込みリストを避けるより柔軟な構造:

TopStory { 
    "UserId": ObjectId("..."), 
    "StoryId" : ObjectId("..."), 
    "StoryName" : "foo", 
    "FriendVotes" : 28, 
    "TotalVotes" : 200 
    // etc. 
} 

後者は、たとえば投票の合計数でソートするためにも使用できます。

M/Rは、ウェブフロントエンドなどからリアルタイムで実行されるべきではない「大きなハンマー」であった。これを改善する計画がありましたが、私はその現状を知らないので安全にプレーしたいと思います。私はまた、あなたのコレクションが大きくなった場合、このM/Rの仕事はあまり速くないと信じています。ミリ秒よりもむしろ数分であれば、数十秒のオーダーでこれが実行されると考えています。

+0

答えをありがとう、それはうまくスケールされていない計算上複雑な問題のようです。このような問題は、別のデータベースシステムを使用して簡単に解決できると思いますか? – Inc1982

+0

np。ええ、これは関係性の高い問題だと思うので、RDBMSは簡単になります。 RDBMSは、最適化できる関係を見つけることができます:この場合、友人の集合は交差点を計算し、並べ替えを行うために使用されます。私はどちらが良いか分かりません。質問は、2つの異なるdbシステムを使用するかどうかです... – mnemosyn

関連する問題