1

Mongoose で 2 つのフィールドへの全文検索をエミュレートしようとしています。私は一日のほとんどをいくつかのクエリ タイプのテストに費やしてきましたが、いつも失敗してきました。MongoDB シェル クエリは次のとおりです。

db.feeds.item.find({lang:"en", $or:[{title: /searchexpression/}, {body: /searchexpression/}] })

この例では、タイトルまたは本文フィールド、または両方のフィールドの検索式 (正規表現を含む) に一致する英語のドキュメントのみを返したいと考えています。このクエリは機能しますが、私が言ったように、Mongooseで適応させようとすると問題が発生します :-(

私が使用したいくつかの表現は機能しませんでした:

exports.fullTextSearch = function(lang, text, callback) { 
    MyModel.find({lang:lang, $or: [{title:/text/},{body:/text/}]}).exec(callback);
    MyModel.find({lang:lang, $or: [{title: new RegExp('\/'+text+'\/')}, {body:new RegExp('\/'+text+'\/')}]}).exec(callback);
    MyModel.find({lang:lang}).or({title:/text/},{body:/text/}).exec(callback);
    MyModel.find({lang:lang}).or({title:new RegExp('\/'+text+'\/')},{body:new RegExp('\/'+text+'\/')}).exec(callback);    

}

どうもありがとうございました!

ルイス・カッパ

4

1 に答える 1

0

これをテストしていませんが、ドキュメントによると、これは機能するはずです:

MyModel.find({lang:lang}).or([{title:/text/},{body:/text/}]).exec(callback);

3番目の例と同様ですが、配列に「または」条件があります。

編集:

正規表現を動的にするには、4 番目の例を使用しますが、配列内に「または」条件を指定します。

MyModel.find({lang:lang}).or([{title:new RegExp(text)},{body:new RegExp(text)}]).exec(callback);

または、外部で正規表現を定義します。

var regexText = new RegExp(text)
MyModel.find({lang:lang}).or([{title:regexText},{body:regexText}]).exec(callback);
于 2012-08-29T08:13:57.170 に答える