2012-08-29 47 views
1

我試圖用Mongoose emilation與全文搜索到兩個領域。我花了大部分時間來測試幾種查詢類型,但我總是失敗。該MongoDB的外殼查詢是這個:貓鼬:布爾'或'用通配符查詢

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

在這個例子中,我想回到在標題字段或在這兩個領域相匹配的搜索表達式(包括正則表達式)只有英文文件。此查詢工作,但問題開始,正如我所說的,試圖用貓鼬適應它的時候,:-(

,我曾經和一些表達式沒」 T工作:

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);  

}

非常感謝你!

路易斯·卡帕。

回答

0

沒有測試過這一點,但根據documentatio n這應該工作:

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); 

或限定外部的正則表達式:

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

我以前試過相同的查詢,並沒有工作。我再次複製粘貼到你的建議和什麼都沒有,:-(我開始認爲這可能是一個貓鼬的bug ... – lcappa

+0

我試過包括RegExp的查詢,沒有運氣 – lcappa

+0

我簡化了查詢執行搜索到只有一個字段,如:MyModel.find({lang:lang,title:new RegExp('\ /'+ text +'\ /')})。exec(callback);它可能是一個與Mongoose相關的錯誤使用正則表達式,甚至是一個非文檔化的查詢組件 – lcappa