Case insensitive search in Mongo

前端 未结 5 2072
时光说笑
时光说笑 2020-11-29 21:04

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 am ha

相关标签:
5条回答
  • 2020-11-29 21:28

    You can use '$regex':'^win$' or /^win$/i (notice no quote on the second one)

    Source here : Regex in queries with Mongo

    0 讨论(0)
  • 2020-11-29 21:28

    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

    0 讨论(0)
  • 2020-11-29 21:32

    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/

    0 讨论(0)
  • For Case insensitive

    db.users.find({"name":{ $regex : new RegExp("Vi", "i") }})
    

    For Case sensitive

    db.users.find({"name":"Vi"})
    // or
    db.users.find({"email":"example@mail.com"})
    

    search in user table

    name is column name and "Vi" text that are searched

    0 讨论(0)
  • 2020-11-29 21:35

    Use $strcasecmp. The aggregation framework was introduced in MongoDB 2.2. You can use the string operator "$strcasecmp" to make a case-insensitive comparison between strings. It's more recommended and easier than using regex.

    Here's the official document on the aggregation command operator: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp .

    0 讨论(0)
提交回复
热议问题