MongoDB Scala绑定Casbah查询DSL与$ regex的行为奇怪

时间:2013-12-29 09:11:54

标签: regex mongodb scala casbah

我有一些代码试图在查询中使用$ regex:

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)

想法是打印目录中的所有项目。但在编译时会抱怨:

  

value $ regex不是String

的成员

但是当我使用$ eq时似乎很好:

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

问题是asked before说:

  

它抱怨$ regex,因为它没有找到右侧的正则表达式对象来应用用于解析$ regex方法的转换 - 这是一个问题,你会遇到以下所有问题也打电话。

我不确定这是否真的有效。

进一步的混淆在于$regex being defined in a trait而没有任何暗示。

我对Scala很新,文档有时令人困惑。

2 个答案:

答案 0 :(得分:2)

如果您使用以下查询

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

这将呈现

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

而不是

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

Casbah将识别第二个参数的类型并使查询适当。如果您发送模式而不是正则表达式,如下所示:

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

你会得到你想要的东西:

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

答案 1 :(得分:0)

您可以在查询中使用scala native regex,例如:

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

似乎$regex由于某种原因没有被添加到核心DSL隐式转换器中,我将在Casbah 2.7中修复它(SCALA-142