我正在尝试支持从 MongoDB 获取文档列表的 REST API 的任意过滤器。例如
- //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]]。但是我不知道检查值是字符串还是其他东西的好方法。
还有另一种更好和惯用的方法来做我想做的事吗?