regexmongodbscalacasbah

The MongoDB Scala binding Casbah query DSL acts strangely with $regex


I have some code attempting to use $regex in a query:

val mongoClient = MongoClient()  // connect locally
val db = mongoClient("testdb")
val gridfs = GridFS(db)

val x = gridfs.files("filename" $regex "^[a-zA-Z]+\\/.+")
x.foreach(println)

The idea is to print all items in a directory. But when compiling it complains:

value $regex is not a member of String

But when I use $eq it seems to be fine:

val x = gridfs.files("filename" $eq "index.html")

A question was asked before that said:

It complains about $regex because it isn't finding a regex-able object on the right hand side to apply the conversion used to parse the $regex method--this is a problem you will run into with all of the following calls as well.

I am not sure if this is actually valid.

Further confusion lies $regex being defined in a trait without any implicit.

I am very new to Scala, the documentation is confusing at times.


Solution

  • If you use the following query

    ("filename" -> "/name/i".r) or "filename" $regex "/name/i"
    

    this will render

    { "name": { "$regex" : "/name/i" } } 
    

    instead of

    { "name" : { "$regex" : /name/i } }
    

    Casbah will recognize the type of the second argument and make the query appropriate. If you send pattern instead of regex like the following:

    "filename" -> java.util.regex.Pattern.compile("name", Pattern.CASE_INSENSITIVE)
    

    you will get what you want:

    { "filename" -> { "$regex" : "name", "$options" : "-i" } }