Mongoid'或'和'in' - 查询多个数组

Jim*_*myP 3 ruby hash mongodb mongoid mongoid4

我在Mongo中有一个带有两个数组字段的文档:

field   :app_usernames,     type:  Array 
field   :email_addresses,   type:  Array
Run Code Online (Sandbox Code Playgroud)

我想创建一个函数,它将一组用户名和一组电子邮件地址用于搜索集合.踢球者是我希望它返回具有数组中传递的任何值的文档:

def find_people(usernames_to_search, emails_to_search)...
Run Code Online (Sandbox Code Playgroud)

所以给出一个带字段值的文档:

app_usernames = ['test1','test2','test3']
email_addresses = ['test1@test.com','test2@test.com']
Run Code Online (Sandbox Code Playgroud)

我希望函数在通过数组参数搜索任何值时找到它.它应该在以下情况下返回此文档:

find_people nil,['test1@test.com']
find_people ['test3'],['test1@test.com']
find_people ['oldusername'],['test1@test.com']
Run Code Online (Sandbox Code Playgroud)

最后一个似乎给我带来了麻烦.

到目前为止,我已经尝试过

.or(:app_usernames.in usernames_to_search, :email_addresses.in emails_to_search)
Run Code Online (Sandbox Code Playgroud)

但无济于事.

mu *_*ort 5

or方法旨在通过单个条件列表调用,以便它可以转为:

x.or(condition1, condition2)
Run Code Online (Sandbox Code Playgroud)

进入MongoDB查询,如:

$or: [ condition1, condition2 ]
Run Code Online (Sandbox Code Playgroud)

当你说:

.or(:app_usernames.in => usernames_to_search, :email_addresses.in => emails_to_search)
Run Code Online (Sandbox Code Playgroud)

你传递了多少个论点or?答案是一个.你实际上这么说:

.or({ :app_usernames.in => usernames_to_search, :email_addresses.in => emails_to_search })
Run Code Online (Sandbox Code Playgroud)

您需要自己添加大括号,以便Ruby不会将参数折叠为一个Hash:

.or(
  { :app_usernames.in   => usernames_to_search },
  { :email_addresses.in => emails_to_search    }
)
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

args = [ ]
args.push(:app_usernames.in => usernames_to_search) if(usernames_to_search.present?)
args.push(:email_addresses.in => emails_to_search)  if(emails_to_search.present?)
query = query.or(*args) if(args.present?)
Run Code Online (Sandbox Code Playgroud)