0

次のような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にいます。

4

2 に答える 2

2

配列に対して複数のクエリを実行する必要がある場合、少なくとも私たちにとって最善の解決策は、ElasticSearchを使用することでした。これに加えて、他のいくつかのボーナスがあります。そして、Mongoのインデックス要件を減らすことができるので、それはwin/winです。

于 2012-07-25T21:13:15.027 に答える
1

私の2セントはMongoDB用です。データを生のRubyハッシュとして表現、保存、ロードできるだけでなく、Mongoは最新で高速であり、非常に簡単に知ることができます。Mongoサーバーを起動するために必要なことは次のとおりです。

mongod --dbpath /path/to/dir/w/dbs

次に、基本的なJavaScriptコンソールであるコンソールを取得するには、を呼び出しmongoます。そしてそれを使用するのはこれだけ簡単です:

require 'mongo'
db = Mongo::Connection.new['somedb']
db.stuff.find #=> []
db.stuff.insert({id: 'abcd', name: 'Swedish Chef', says: 'Bork bork bork!'})
db.stuff.find #=> [{id: 'abcd', name: 'Swedish Chef', says: 'Bork bork bork!'}]
db.stuff.update({id: 'abcd', {'$set' => {says: 'Bork bork bork!!!! (Bork)!'}}})
db.stuff.find #=> [{id: 'abcd', name: 'Swedish Chef', says: 'Bork bork bork!!!! (Bork)!'}]
于 2012-07-22T23:41:53.590 に答える