2012-01-27 12 views
1

MongoDBでの索引の設計に関する質問があります。MongoDBでの索引作成 - より良い方法です

私はユーザーコレクションとグループコレクションがあります。

user { 
name : "" , 
age : 19 
} 

group { 
name : "" 
members : [], 
posts : [ { date : "" , author : "" , topic : "" }, { date : "" , 
author : "" , topic : "" } ......] 
} 

は、グループの1000年の者が存在することができ、各グループは 記事の何百万人を持つことができます。私は頻繁に行う操作は次のとおりです。日付(70%)

  • 更新記事(30%)に基づいて投稿
  • を取得

    1. だから、基本的に、私は日にインデックスにする必要があります。

      私の質問は:

      iは

      posts { 
      name : "", date : "" , author : "" , topic : "" 
      } 
      

      のような新しい記事コレクションを作成し、ポストコレクションに日の単一値のインデックスを作成する必要があります

      (db.posts.ensureIndex({posts : 1})) 
      

      OR

      私はpoを含めるべきですか?グループオブジェクト内にstsを埋め込み、db.groups.ensureIndex({ posts.date : 1})

      のような埋め込み式 を作成してください。どちらが効率的ですか?これが必要な場合はベストプラクティスは何ですか 何百万にも及ぶ規模のスケール?

      おかげ

    答えて

    0

    @ Z5h、私はこの問題を誤解していると思います。 問題は、特定のグループの投稿を日付範囲内で取得していたことです。 とそれらを最も効果的に格納する。

    いくつかの思考と研究の後、これが私が知ったものです。

    • まず、(現在は16メガバイト)文書のサイズに制限がありますし、ポストスキーマ/ポストは、サイズが大きくなるように、これはポストの数はuが追加することはできませんincrease.andとして、いくつかの日スケーリング停止することがありますインデックスはサブ文書の配列内を検索するためのインデックスです。インデックスはコレクション全体にしか存在しません。

    • 第2に、投稿が埋め込まれたサブ文書として保存されている場合、期間内のグループの投稿内を検索する方法はありません。私は全体の配列を取得し、非効率なクライアント側で処理を行う必要があります。今のところ、サブドキュメントのフィールドに基づいて配列オブジェクトを比較する方法はありません。より良い方法は、別の記事のコレクションを作成することであり、この方法ではfollデータ

      posts{ 
      group_name : objectID(<ID in groups collection>), 
      date : "", 
      author : "", 
      topic : "" 
      } 
      

    を持って、私も日付にインデックスを作成し、すべてのデータを取得することができますしたがってthis

  • を参照してください。より効果的に日付範囲のグループの

  • 0

    あなたは、ドキュメントのインデックス(多くのキー/値ペア値ではなく)、あなたは正確にインデックスを使用するクエリのためにそのドキュメントを検索する必要があります。 (例えば、名前、日付、著者は知っていますがトピックは分からない場合は、インデックスは使用されません)。これは実際にあなたの場合の有用性を制限します。

    より良いオプションは、複合インデックスを作成することです。日付別
    投稿、または日付やトピックごと
    投稿、または日付、話題と著者によって
    の記事:あなたが効率的に検索できることで
    db.posts.ensureIndex({ posts.date : 1, posts.topic : 1, posts.author : 1});
    :たとえば。
    http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes