次のような1,000万のドキュメントのコレクションがあるとします。
{
"_id": "33393y33y63i6y3i63y63636",
"Name": "Document23",
"CreatedAt": "5/23/2006",
"Tags": ["website", "shopping", "trust"],
"Keywords": ["hair accessories", "fashion", "hair gel"],
"ContactVia": ["email", "twitter", "phone"],
"Body": "Our website is dedicated to making hair products that are..."}
タグ、キーワード、およびContactViaの3つの属性のいずれかを含む、任意の数のデータベースにクエリを実行できるようにしたいと思います。ANDS(このドキュメントにはXとYの両方の属性が含まれています)またはOR(このドキュメントにはXまたはYの属性が含まれています)を介して選択できる必要があります。
クエリの例:
「ヘアアクセサリーまたはファッション」に一致するキーワードと「メール」を含むcontact_viaを使用して、ウェブサイトとショッピングのタグが付いた最初の10個のドキュメントを教えてください。
「ヘアジェル」または「ヘアアクセサリー」というキーワードに一致する、「ウェブサイト」または「信頼」のタグが付いた2番目の20個のドキュメントを教えてください。
「website」というタグが付いた50のドキュメントをください。
また、ドキュメント内の他のフィールド(スコアタイプ)または作成日または更新日でこれらを並べ替える必要があります。したがって、定期的に照会される「範囲」は基本的に4つあります。
私はSQLベースから始めました。次に、配列とハッシュ(大好きです)をサポートしていたので、Mongoに移動しました。ただし、インデックスを使用する複数の範囲をサポートしていないため、Mongoデータベースは低速です。インデックスを使用できず、1,000万のドキュメントをスキャンする必要があるためです。
より良い代替案はありますか?これは、このアプリケーションを本番環境(およびそれに伴う収益)に移行することを妨げています。適切なデータベースまたは代替アーキテクチャに関する考えをいただければ幸いです。
それが問題なら、私はRuby/Railsにいます。