How do you do wildcard searches with Mongoid in a Ruby on Rails environment?
Solution 1
You need this to find people with "na" in the name.
Person.where(first_name: /na/i)
As for your example:
Person.where(first_name: /^d/i)
^
means "beginning of the line". This regex will match all strings where first letter is "d". /i
means "do case-insensitive matches". So it'll match both "d" and "D".
Note: only prefix regexes (with ^
in front) are able to use indexes.
Is there website or guide with this information?
Here's my favourite.
Solution 2
This is not a "wildcard" search, this is called a regular expression.
/^d/i
- The two slashes are only the regex delimiters, you search for what is in between those two slashes.
- The following
i
is a modifier or option. It changes the matching behaviour of your regex, thei
stands for case insensitive, means it matches "d" and "D". - The first character
^
is an anchor, it anchors the search pattern to the start of the string, means match "d" only at the start of the string
A good tutorial about regular expressions is the tutorial on regular-expressions.info
If you want to search for a string anywhere in the string, just remove the anchor that binds the pattern to the start, /na/
will find "na" anywhere in the string.
Related videos on Youtube
Goalie
Updated on June 29, 2022Comments
-
Goalie almost 2 years
The Mongoid documentation only gives one example of doing a wildcard search:
Person.where(first_name: /^d/i)
This finds all people with the first name that starts with "d".
What do the
/^
and/i
represent?How do I find all people with their first name having an "na" in the middle of the string? E.g., this query would find "jonathan" since "na" is a substring of the entire string.
Is there website or guide with this information?
-
Jagdeep Singh over 7 yearsIs it possible to do query like
Person.where(first_name: /na/i)
if the fieldfirst_name
is of typeMongoid::EncryptedString
. I am using mongoid 3.1.6 and getting TypeError: no implicit conversion of Regexp into String. -
TimP almost 4 years@JagdeepSingh, not directly unfortunately. You can iterate through the whole data-set though, something like
Person.all.select { |p| p.first_name ~= /na/i }
, which is obviously less efficient.