Я пытаюсь поддерживать произвольные фильтры для REST API, который извлекает список документов из MongoDB. Например
- //example.com/users ‹ — список всех
- //example.com/users?age=30 ‹- все пользователи старше 30 лет
- //example.com/users?age=30&name=John ‹- все пользователи в возрасте 30 лет, которым звонит John
- ...
Я использую Play-ReactiveMongo и работаю только с объектами JSONCollection.
Поэтому в своих маршрутах я ставлю
GET /users controllers.Users.list(id: Option[String], name: Option[String], age: Option[Int])
Но с этим есть две проблемы: сначала мне нужно иметь довольно длинный список необязательных параметров, а затем в моем контроллере мне нужно использовать сопоставление с образцом для всех из них, чтобы проверить, пусты они или нет, а также создайте селектор, который я использую для фильтрации моей коллекции.
var filters = JsObject(Nil)
name match {
case Some(x) => filters += ("name" -> JsString(x))
case None => None
}
Я понял, что могу получить полную строку запроса из объекта запроса, который представляет собой Map[String, Seq[String]]. Но тогда я не знаю хорошего способа проверить, являются ли значения строковыми или чем-то еще.
Есть ли другой лучший и идиоматический способ делать то, что я хочу?