2012-08-30 77 views
2

我有一個MongoDB查詢,我正在運行,並且它沒有拉回我知道它應該記錄的記錄。我過濾了兩件事:類別和描述(通過包含/像正則表達式)。如果我根據類別進行搜索,則該類別中的所有記錄都會返回(包括問題記錄),但是如果我放入描述中,則無法取回該記錄。與描述文字相匹配的其他記錄會回來,但由於某種原因,無論我放入什麼內容,我都無法獲得這一條記錄以返回描述條件。這是非常奇怪的。如何調試MongoDB查詢?

如何開始使用MongoDB調試這樣的事情?我的查詢是非常簡單的:

var match = {}; 

var category = "hardware" 
if (category) 
    match.Category = category; 

var searchText = "ceramic" 
if (searchText) 
{ 
    match.Description = new RegExp("/.*" + searchText + ".*/"); 
} 

collection.find(match).toArray(function(err, items) 
{ 
    response.send(items); 
}); 

,我試圖找回該項目是在硬件類別,它回來時SEARCHTEXT是「」。它在描述中有「陶瓷」一詞,但是當searchText是「陶瓷」(或其他描述中的其他詞)時,該項不會回來。其他人在他們的描述中有「陶瓷」一詞,但並不是那樣,當然這個項目的結構與其他項目沒有什麼不同。這真的應該是通過比賽。

殼體正確(「陶瓷」是在兩個說明書和過濾器的所有降低),並且我也試着/ i到使搜索不區分大小寫的。

所以,我怎麼能找出爲什麼這個查詢未能產生很清楚它相匹配的項目?

+2

對於該文檔,在「陶瓷」查詢中不會有什麼不同。你可以添加該文件的帖子? – JohnnyHK

回答

1

嗯,這可能不是原因,但是這個正則表達式有點奇怪。你應該能夠指定這樣的:

match.Description =新的RegExp( 「/」 + SEARCHTEXT + 「/」);

.*意味着可以匹配任何字符任意次數 - 除非您試圖將所有內容與貪婪的內容匹配並將其用作更復雜的正則表達式的一部分,那麼您就不需要它了。

在調試方面,找出你的查詢應該是什麼樣子MongoDB中,並確保它在外殼。這裏有一個快速的樣品DOC:

{ 
    "_id" : ObjectId("503fab7bf6a278b7bda257d2"), 
    "category" : "hardware", 
    "Description" : "blah ceramic blah" 
} 

而這種匹配:

mongos> db.foo.find({"Description" : /ceramic/}).pretty() 
{ 
    "_id" : ObjectId("503fab7bf6a278b7bda257d2"), 
    "category" : "hardware", 
    "Description" : "blah ceramic blah" 
} 

turn on profiling能看,看看你的程序發送到MongoDB的(注意,分析了間接費用)。您將希望級別2能夠查看頁面上提到的所有查詢。