2017-02-09 102 views
0

我想改進我的搜索方法 - 這應該是不區分大小寫的。在我的設置中有五個不同的集合,我想搜索它們的title字段。 另外我還需要得到部分結果(最少3個字符)。MongoDB:優化搜索多個集合

// Collection 1 
{ title: 'Sample' }, 
{ title: 'Another sample' } 
{ title: 'This is an example' } 

// Collection 2 
{ title: 'Something else' }, 
{ title: 'A sample document' } 
{ title: 'This is another example' } 
  1. Ample:所有文件,除了第二收集
  2. Sample的第一個:採集1的第一兩個文件和收集的第二2
  3. another :第二份收集文件1
  4. is:不應該給任何結果(< 3個字符)

到目前爲止,我做了這個

db.collection.find({ title: new RegExp(value, 'i') }).fetch() 

...每個集合,並將結果合併成一個陣列。

但我認爲這是不是最佳的,因爲使用正則表達式,並且所有文檔都必須由數據庫搜索。

所以我轉向使用全文搜索。我添加一個索引title,並試圖此:

db.collection.find({ $text: { $search: value } }).count() 

但隨後Samp甚至不給我的第一個文件。

最後但並非最不重要我不知道如何執行所有五個集合的搜索來獲得所有匹配作爲一個結果。

回答

0

這是MongoDB的手冊說:

對於區分大小寫的正則表達式查詢,如果 有一個索引字段,然後MongoDB的一致反對該指數 值的正則表達式,可以比收集掃描更快。 如果正則表達式是「前綴 表達式」,則表示所有可能的匹配都以 相同的字符串開頭,則可能會發生進一步的優化。這允許MongoDB從該 前綴構造一個「範圍」,並且只與來自該範圍內的 索引的那些值相匹配。

正則表達式是一個「前綴表達式」,如果它以 插入符號(^)或左側錨點(\ A)開頭,後跟一串簡單的 符號。例如,正則表達式/^abc.*/將通過匹配 而僅針對以abc開頭的索引中的值進行優化。

,這是很重要的:

對於不區分大小寫的正則表達式查詢,這些查詢 一般不能有效地使用索引。

對於你的情況,你應該使用$regex關鍵字,並在您value變種使用.*

db.collection.find({ $text: { $regex: value, options: 'i' } }).count() 

對於你最後一個問題 - 我沒有看到任何其他的解決辦法,不是每一個集合做find,通過.forEach傳遞的結果和將結果追加到同一個陣列/對象。