私は mongo noob で、とても簡単な質問だと思います。昨日、100 GB の .bson ファイルを受け取りました。URL に関連付けられたドキュメントをすばやく取得する必要があります。残念ながら、データベースを管理していた人々は、URL を保存するためのスキーマを寿命の途中で変更することにしました。これは、url フィールドを正規表現でクエリする必要があり、インデックスを作成できないことを意味します。
私が望んでいるのはこれです: URL の 2 つのバージョン間で共通の文字列を正規表現し、それを という新しいフィールドに格納しますurl_id
。このフィールドは、クエリを高速化するためにインデックスを作成できます。過去のSOの投稿をいくつか見て、トリックを実行する可能性のあるいくつかの擬似コードをまとめました。
//pseudo code, i dont know javascript that well.
db.eval(function() {
db.foo.find({}, {url:1}).forEach(function(e) {
match = e.url.match(/.*(domain.com/.*)?(\\?.*)/); //remove http, www, and query strings
e.url_id = matches[1];
db.foo.save(e);
});
});
次に、実行できます:
db.foo.ensureIndex({url_id:1})
クエリを実行する前にURLを適切に変更する限り、クエリが高速になる新しいインデックスが作成されます。
ただし、100 GB のレコードに対して for ループを実行する可能性が怖いです。私が考えていないこれを行うためのより良い方法はありますか?