Я изучаю Скала и пытаюсь Монго тоже. Я создаю функцию, которая принимает Map[String, Any]
в качестве параметра, и я хотел бы вернуть надлежащее MongoDBObject
для него:Scala casbah DSL-запросы
def parse(query: Map[String, Any]): MongoDBObject = {
val result = query("operation") match {
case "all" => query("field").toString $all query("value").asInstanceOf[List[String]]
case "in" => query("field").toString $in query("value").asInstanceOf[List[String]]
case "regex" => query("field").toString $regex query("value")
case "eq" => query("field").toString $eq query("value")
case "gt" => query("field").toString $gt query("value")
case "gte" => query("field").toString $gte query("value")
case "lt" => query("field").toString $lt query("value")
case "lte" => query("field").toString $lte query("value")
case "exists" => query("field").toString $exists query("value").asInstanceOf[Boolean]
case "size" => query("field").toString $size query("value").asInstanceOf[Int]
case "where" => $where(query("value").toString)
case _ => throw new NotImplementedError("Unknown operation")
}
}
У меня есть несколько вопросов.
- компилятор говорит
$regex
не является членомString
. Я не знаю почему. - компилятор говорит, что
Any
не является допустимым параметром запроса. Я полагаю, что я должен использовать int, string, date или любой другой подходящий тип Mongo. Есть ли способ исправить это без размышлений, чтобы решить, какой тип значения? - для операции
$mod
Я должен дать два числовых значения в качестве параметров. Должен ли я использоватьList
в качестве значения для карты и получить первый и второй пункты?
Гораздо лучше aproach. Но все же мне придется отбросить мой Any на тип. Я использую эту карту [String, Any], потому что я разбираю JSON, используя собственные синтаксические анализаторы scala. И это дает мне карту [String, Any], поэтому мне придется отнести это Any к соответствующему типу. Я подумал о рефлексии, чтобы проверить тип, который он есть, и вернуть его с правильным приведением. О проблеме $ regex, я использовал учебник в документах, которые указывают мне на использование SBT, поэтому я думаю, что он загрузил последнюю банку. Я прошел через банку и нашел там функцию $ regex ... Я понятия не имею, почему компилятор жалуется на это – Augusto
Если у вас есть контроль над форматом сообщений JSON, вы можете использовать json4s (https://github.com/json4s/json4s) для сериализации и десериализации классов классов. Даже если вы этого не сделаете, используя эту библиотеку, вы можете извлечь тип запроса и затем десериализовать соответственно. –
спасибо. это будет работать :) – Augusto