首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala播放ReactiveMongo -任意查询参数列表

Scala播放ReactiveMongo -任意查询参数列表
EN

Stack Overflow用户
提问于 2014-09-23 09:52:01
回答 2查看 248关注 0票数 1

我试图为从MongoDB获取文档列表的REST支持任意筛选器。例如

  • //example.com/user <- list all
  • //example.com/user?age= 30 <- -所有30岁的用户
  • //example.com/user?age= 30 &name= John <-所有30岁且名为John的用户
  • ..。

我使用的是Play-ReactiveMongo,只处理JSONCollection对象。

所以在我的路线上

代码语言:javascript
复制
GET   /users        controllers.Users.list(id: Option[String], name: Option[String], age: Option[Int])

但这有两个问题,首先,我需要有一个相当长的可选参数列表,然后在控制器中,我需要对所有参数使用模式匹配来检查它们是否为空,还需要构建用于筛选集合的选择器。

代码语言:javascript
复制
var filters = JsObject(Nil)
name match {
  case Some(x) => filters += ("name" -> JsString(x))
  case None => None
}

我意识到可以从请求对象获得完整的查询字符串,即Map[ string,SeqString]。但是,我不知道有什么好方法来检查值是字符串还是其他东西。

还有别的更好更地道的方法来做我想做的吗?

EN

回答 2

Stack Overflow用户

发布于 2014-12-18 05:52:16

可能的解决办法可以是:

  1. 使用POST而不是GET:POST /example.com/ Use "data"={"age":25,"name":"xyz",.}
  2. 或在GET:GET /example.com/user中的单个param ?filter={“age”:25,"name":"xyz",.}

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

票数 0
EN

Stack Overflow用户

发布于 2016-06-12 17:16:48

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

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

例如,您可以(从文档中)构建类似的内容:

代码语言:javascript
复制
case class AgeRange(from: Int, to: Int)

对于这样的请求:

代码语言:javascript
复制
/age?from=1&to=10

现在,您可以将这些属性更改为选项,并创建一个基于当前值创建reactivemongo查询的函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25992024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档