我有一些代码试图在查询中使用$ 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很新,文档有时令人困惑。
答案 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)