首页 > 解决方案 > 匹配 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。)

标签: ruby-on-railsmongodb

解决方案


不是一个很好的解决方案,但它有效:

condition = "John Smith"
regex = '^(?=.*' + condition.split(/\s+/).map{ |x| Regexp.quote(x) }.join(')(?=.*') + ')'
@contacts = Contact.where({name: /#{regex}/i })

推荐阅读