2013-01-01 81 views
0

我對MongoDB和正則表達式很陌生,所以請耐心等待。 MongoDB的文檔具有與正則表達式的搜索的例子:使用正則表達式在MongoDB中搜索任何值?

http://docs.mongodb.org/manual/reference/operators/#_S_regex

然而,僅示出了如何搜索預定鍵的值。 我不確定如何編寫查詢來搜索集合中的所有值,如果任何人都可以指出它會很好。

+1

如果通過MongoDB的語法是不可能的,那首先獲得所有潛在的字段列表,然後構建搜索查詢並運行它。爲什麼不嘗試呢? – hakre

+0

在這種情況下,您的建議似乎是唯一的選擇。謝謝。 – styke

+0

我不流利使用MongoDB的,然而,直到一些MongoDB的裂紋就會發現你的問題,我會嘗試在此期間,一些替代路徑,如果你發現新增加的可能updage問題(你甚至可以回答你自己的問題,如果你喜歡) 。我可以想象這個問題有一些常用的問題。 – hakre

回答

0

如果您不關心數據庫大小(或性能),則可以使用mapReduce函數將數據解規格化爲更容易搜索的結構。但是,這將顯着增加數據庫的大小,因爲您將複製該集合的所有數據。

僞代碼:

// recursive 
// building a full property path 
for(var key in obj) { 
    emit(this._id, { orig: obj[key], src: path + "." + key }); 
    // recursive call emitChildren(path, key) 
} 

根據數據的複雜性,也可能是合理的。

或者,您可能可以使用$where對所有文檔的每個鍵/值執行正則表達式(因爲您可以在使用$ where時執行任意JavaScript)。

無選項是要執行好(甚至是內置的選項),也沒有發揮的MongoDB的優勢,如果你是一個集合中的每個文件上運行的每個值正則表達式。

+0

MR這裏當然是一個壞主意,因爲它的重量,一個'$ where'可以工作,如果只有JS enigne民政事務CON-貨幣的功能。正如你所說,它不會高​​效,但它會起作用。但是,如果沒有控制貨幣功能,它將不會由於此查詢的呼叫需求。 – Sammaye

+0

$哪裏可以工作 - 它只是可能會限制可擴展性可能取決於使用情景([詳情](http://docs.mongodb.org/manual/faq/concurrency/#what-kind-of-concurrency-does-mongodb - 提供換JavaScript的操作))。 – WiredPrairie

+0

那麼主要的問題是用戶想要使用它來動態地搜索表字段,這意味着'$ where'很可能是查詢中唯一的子句。當然,'$ where'不使用索引,並且可以使查詢速度降低10倍,並且採用JS鎖,這樣不會中斷其他查詢,因此如果要在大型表上完成,它不僅僅需要可伸縮性但是通常查詢的任何類型的實時行爲都會給。 – Sammaye