2014-10-09 3 views
3

У меня есть документ в Монго с двумя полями массива:Mongoid «или» и «в» - запрашивая несколько массивов

field :app_usernames,  type: Array 
field :email_addresses, type: Array 

Я хотел бы создать функцию, которая принимать массив имен пользователей и массива адресов электронной почты для поиска коллекции. Кикер, что я хочу, чтобы вернуть документы, которые имеют любой из значений, переданных в массивах:

def find_people(usernames_to_search, emails_to_search)... 

Так данным документом, со значениями:

app_usernames = ['test1','test2','test3'] 
email_addresses = ['[email protected]','[email protected]'] 

Я хочу функцию найти его, когда поиск любого из этих значений осуществляется через параметры массива. Он должен вернуть этот документ в следующих случаях:

find_people nil,['[email protected]'] 
find_people ['test3'],['[email protected]'] 
find_people ['oldusername'],['[email protected]'] 

Последний, кажется, вызывает у меня проблемы.

До сих пор я пытался

.or(:app_usernames.in usernames_to_search, :email_addresses.in emails_to_search) 

но безрезультатно.

ответ

5

Метод or предназначен называться со списком индивидуальных условий, так что он может превратить это:

x.or(condition1, condition2) 

в запрос MongoDB, как:

$or: [ condition1, condition2 ] 

Когда вы говорите:

.or(:app_usernames.in => usernames_to_search, :email_addresses.in => emails_to_search) 

Сколько аргументов вы переходите на or? Ответ один. Вы на самом деле это говорю:

.or({ :app_usernames.in => usernames_to_search, :email_addresses.in => emails_to_search }) 

Вы должны добавить фигурные скобки себя так, Руби не разрушится аргументы в один Hash:

.or(
    { :app_usernames.in => usernames_to_search }, 
    { :email_addresses.in => emails_to_search } 
) 

Или что-то вроде этого:

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?) 
+0

Отлично! Спасибо. – JimmyP

Смежные вопросы