2015-10-13 64 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'来将字符串映射到正则表达式 –