Case insensitive search in Mongo
Solution 1
You can use '$regex':'^win$'
or /^win$/i
(notice no quote on the second one)
Source here : Regex in queries with Mongo
Solution 2
You can Use $options => i
for case insensitive search. Giving some possible examples required for string match.
Exact case insensitive string
db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})
Contains string
db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})
Start with string
db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})
End with string
db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})
Doesn't Contains string
db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})
Keep this as a bookmark, and a reference for any other alterations you may need. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
Solution 3
UPDATE: As of MongoDB 2.4 one would use a "text" index and full text search query to do this. You can read about them here. If using a recent MongoDB the approach below would be silly and unecessary.
However, if you have MongoDB < 2.4.0 you could use a regular expression like so:
> db.reg.insert({searchword: "win"})
> db.reg.insert({searchword: "window"})
> db.reg.insert({searchword: "Win"})
> db.reg.find()
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e36dd68c9021e453d13"), "searchword" : "window" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }
> db.reg.find({ searchword: /^win$/i })
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }
However, your version wasn't working because you don't need the "/"s when using the $regex operator:
> db.reg.find({ searchword: { $regex: "^win$", $options: '-i' }})
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }
Please note that case insensitive queries do not use the index so it might make sense to make a lowercase searchword field so that you can speed that query up.
Go here for more info on RegularExpressions
Solution 4
{
$match: {
$expr: {
$and: [
{ $eq: ["$_id", "$$itemId"] },
{
$regexMatch: {
input: "$brandData.name",
regex: "sample",
options: "i",
},
},
],
},
},
},
Related videos on Youtube
Praneeta
Updated on July 08, 2022Comments
-
Praneeta almost 2 years
I am using a case insensitive search in Mongo, something similar to https://stackoverflow.com/q/5500823/1028488.
ie I am using a regex with options i. But I am having trouble restricting the regex to just that word, it performs more like a 'Like' in SQL
eg: if I use query like
{"SearchWord" : { '$regex' : 'win', $options: '-i' }}
, it shows me results for win, window & winter. How do i restrict it to jsut show win?I tried
/^win$/
but it's saying invalid JSON... Please suggest away.Thanks in advance
-
B T about 8 years$text isn't a replacement for regex. It is pretty restrictive and wouldn't allow him to find "winter" with a search for "win".
-
Rohmer about 7 years@BT You're right. In order to do that one would have to store n-grams and match on those. Fuzzy search with MongoDB and Python
-
Rohmer about 7 yearsAlso: Case Insensitive Indexes
-
gauravparmar about 6 yearsBy mistake, you had put the example of "Contains string" inside "Exact case insensitive string" and vice-versa. I have edited your answer by swapping the examples for those two cases and also corrected some grammatical mistakes.
-
Somnath Muluk about 6 years@gauravparmar: Please check and correct if anything is incorrect.
-
gauravparmar about 6 yearsI have edited your answer but it has to be peer-reviewed, it says.