ruby-on-rails - 匹配 mongodb 字段中的任何单词或单词的一部分
问题描述
我在 Rails 中使用 MongoDB 和用于 MongoDB 的 Mongoid ODM。我有一个名为 name 的字段,其中一个文档名称值是“John Paul Smith”。例如:
{“_id”:ObjectId(“582bab8f9f26631b8a000088”),“名称”:“约翰保罗史密斯”,“电子邮件”:“”,“传真”:“”,...
我想使用关键字“John Smith”查找此文档。现在,如果我用“JOHN PAUL SMITH”搜索,它可以工作:
Contact.where(name: " John Paul Smith").first
# => #<Contact _id: 582fab8d9f26631605000054, created_at: 2016-11-19 01:31:57 UTC, ...
但如果我按名字和姓氏搜索,它不会产生结果:
Contact.where(name: "John Smith").first
# => nil
即使我按名字和姓氏的一部分搜索,它也应该产生结果,如下所示:
Contact.where(name: "John Smith").first
目前,我正在使用以下搜索:
Contact.where({name: /.*#{condition}.*/i })
正如我上面所描述的,它并没有做我想做的事。如何按名字和姓氏或名字和部分姓氏或部分名字或名字和中间名搜索字段?(我接受 MongoDB 或 Mongoid 中的解决方案。我不一定需要 Mongoid 解决方案。我可以将 MongoDB 解决方案转换为 Mongoid。)
解决方案
不是一个很好的解决方案,但它有效:
condition = "John Smith"
regex = '^(?=.*' + condition.split(/\s+/).map{ |x| Regexp.quote(x) }.join(')(?=.*') + ')'
@contacts = Contact.where({name: /#{regex}/i })
推荐阅读
- json - 如何使用 Powershell 修改 Json
- vba - TableDef 立即超出范围
- javascript - Nodejs GET REST API和频繁访问MongoDb数据库
- java - 启动Tomcat9服务器时DataSourceFactory的NoClassDefFoundError?
- microsoft-graph-api - 是否可以在正文中搜索具有匹配子字符串以及匹配日期的消息?
- javascript - 如何连接对象数组并返回单个数组数组?
- c - frama-c 切片插件似乎丢弃了使用的堆栈值
- postgresql - Adminer & Migrate 无法连接到 Postgresql Docker 容器
- java - 将结果从 ServerRequest 处理函数传递到 HTML/Thymeleaf
- mysql - 在 MySql Godaddy VPS Cpanel 中使用 sql_mode=only_full_group_by 获取 MYSQL 错误