2013-04-15 15 views
8

ユーザーが検索したものからクエリを生成しようとしています。Meteor&mongoDB LIKEクエリ

Items.find({ $or: [{name: /doc/}, {tags: /doc/}, {name: /test/}, {tags: /test/}] }); 

しかし、私はに管理することができません:私は、私だけのMongoDBセレクタに通じ送信する文字列の配列を持って、私の問題は、それがこのようなMongoDBのコンソールから完璧に動作し、/テキスト/構文でありますjavascriptで同じ構文を書く、私はいくつかのバージョンを試してみました。

var mongoDbArr = []; 
    searchArray.forEach(function(text) { 
    mongoDbArr.push({name: /text/}); 
    mongoDbArr.push({tags: /text/}); 
    }); 
    return Items.find({ $or: mongoDbArr}); 

ただし、変数内の「テキスト」のみを検索します。そして、このように:

しかし、それは私に結果を戻すことはできません。私は何が欠けていますか?

+0

サーバでmongodbを使用するのか、クライアントでminimongoを使用しますか? (または両方?) – mquandalle

+0

今、両方。私はMeteorのデフォルト設定でアプリを試しています。 – Snidd

答えて

18

を、JavaScriptを使用して自分の正規表現を構築する必要があります。

var mongoDbArr = []; 
searchArray.forEach(function(text) { 
    mongoDbArr.push({name: new RegExp(text)}); 
    mongoDbArr.push({tags: new RegExp(text,"i")}); 
}); 

return Items.find({ $or: mongoDbArr}); 

するか、MongoDBのでregular expressionsクエリを使用します。

mongoDbArr.push({name: { $regex : text, $options:"i" } }); 
mongoDbArr.push({tags: { $regex : text, $options:"i" } }); 

特殊文字をエスケープするには、使用する前にこれを行うことができますtext(JQuery UIのソースから)

text = text.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); 
+0

正規表現は今のところうまくいきました。ユーザーが正規表現で別のものを意味する予約文字を入力するとどうなるか心配です。 – Snidd

+0

Iveは特殊文字をエスケープするように答えを修正しました。 – Akshat

+0

Whoa。これらの正規表現の両方がクライアント側で動作しますか?ワオ。はい、そうです。心が吹かれました。これを新しい[Meteor autocompletion](https://github.com/mizzao/meteor-autocomplete)パッケージに入れて... –

5

サーバーにパブリッシュ機能でこれを試してみてください:

return YourCollection.find({'$or' : [ 
    { 'field1':{'$regex':searchString} }, 
    { 'field2':{'$regex':searchString} }, 
    { 'field3':{'$regex':searchString} }, ] 
}); 
+0

これは私のために働いた。ありがとう! –