2015-10-13 66 views
0

我有一個網頁,用戶可以在mongoDB集合中搜索文檔。 我得到了用戶的輸入通過@q = params[:search].to_s通過用戶輸入的多參數搜索 - ruby​​ on rails&mongodb

我然後運行一個查詢mongoid:
@story = Story.any_of({ :Tags => /#{@q}/i}, {:Name => /#{@q}/i}, {:Genre => {/#{@q}/i}})

此,如果用戶尋找像'幽默「浪漫喜劇片」或「神祕」工作正常。但是如果尋找「浪漫小說」,什麼都不會出現。
基本上我想爲我的搜索添加'和''或'功能,以便它可以在數據庫中查找與用戶輸入到輸入字段中的所有字符串相關的文檔。

如何在保持我目前擁有的子字符串搜索功能的同時完成此操作?
在此先感謝您的幫助!

更新:下面 每尤金的評論... 我試圖轉換爲區分與@q.map! { |x| x="/#{x}/i"}不敏感。它確實保存爲["/romantic/i","/comedy/i"]。但查詢Story.any_of({:Tags.in => @q}, {:Story.in => @q})找不到任何東西。 當我更改數組爲["Romantic","Comedy"]。然後它確實。 我該如何正確使它不區分大小寫?

最後:
刪除引用工作。 但是,現在無法使用.and()搜索來查找在所有這些字段中都包含詞的書。

+0

看到我的最後一條評論。這是否解決了這個問題? –

+0

是的,它確實!謝謝 – Gcap

+0

如果有人在這兩年之後絆倒了,可以使用簡單的mongo語法進行AND請求。這將是沿線︰ 查詢= {「$和」=> [{標籤:/浪漫/我},{標籤:/喜劇/我]} @ story = Story.where(query) $和運算符會傳遞一個對象數組,這些對象都必須匹配以匹配最終結果。在Ruby中看起來很醜,但起作用。 –

回答

1

要創建一個OR語句,可以將該字符串轉換爲一個字符串數組,然後將該字符串數組轉換爲一個正則表達式數組,然後使用'$ in'選項。所以首先,選擇一個分隔符 - 可能是逗號或空格,或者您可以設置像||這樣的自定義。假設你用逗號分隔。當用戶輸入:

浪漫,喜劇

您拆分爲['romantic', 'comedy'],然後再轉換到[/romantic/i, /comedy/i]然後做

@story = Story.any_of({ :Tags.in => [/romantic/i, /comedy/i]}....

要創建與查詢,它可以變得有點複雜, 。您可以使用elemMatch功能。

我不認爲你可以做{:Tags => /romantic/i, :Tags => /comedy/i }

所以我最好的想法是做連續查詢,即使會有性能損失,但如果你的數據庫是沒有那麼大,它不該」這是一個大問題。所以,如果你想浪漫喜劇,你可以做

查詢1:查找匹配/浪漫/我

查詢2,所有的集合:取查詢1的結果,查找匹配/喜劇所有收藏/我

通過迭代你的選擇器數組等等。

+0

這幫助了很多,但它仍然沒有正確搜索不區分大小寫的 – Gcap

+1

擺脫您的正則表達式中的引號。 你想''/ /浪漫/我,/喜劇/我]'而不是'[「/浪漫/我」,「/喜劇/我」]'。 你有它的方式,它可能搜索一個字符串,而不是搜索作爲正則表達式。你可以通過不帶引號的'/#{string}/i'來將字符串映射到正則表達式 –