1

我正在尝试支持从 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]]。但是我不知道检查值是字符串还是其他东西的好方法。

还有另一种更好和惯用的方法来做我想做的事吗?

4

2 回答 2

0

可能的解决方案可以是:

  1. 使用 POST 而不是 GET: POST /example.com/users "data"={"age":25, "name":"xyz", ... }
  2. 或 GET 中的单个参数: GET /example.com/users?filter={"age":25, "name":"xyz", ... }

在服务器端,只需针对您的模型类进行验证,或者在您的 reactivemongo find 方法中传递相同的 json。

于 2014-12-18T05:52:16.200 回答
0

也许请求绑定器将帮助您从不同的请求参数创建复杂的对象。

https://www.playframework.com/documentation/2.5.x/ScalaRequestBinders#QueryStringBindable

例如,您可以构建这样的东西(来自文档):

case class AgeRange(from: Int, to: Int)

对于这样的请求:

/age?from=1&to=10

现在您可以将这些属性更改为 Option 并创建一个函数,该函数根据手头的值创建一个响应式mongo 查询。

于 2016-06-12T17:16:48.103 回答