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])

しかし、これには 2 つの問題があります。まず、オプションのパラメーターのかなり長いリストが必要です。次に、コントローラーで、それらすべてに対してパターン マッチングを使用して、それらが空かどうかを確認する必要があります。また、コレクションをフィルタリングするために使用するセレクターを作成します。

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. GET の代わりに POST を使用します: POST /example.com/users "data"={"age":25, "name":"xyz", ... }
  2. または GET の単一パラメータ: GET /example.com/users?filter={"age":25, "name":"xyz", ... }

サーバー側では、モデルクラスに対して検証するか、同じjsonをreactivemongo findメソッドに渡すだけです。

于 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 に変更し、手元の値に基づいて reactmongo クエリを作成する関数を作成できます。

于 2016-06-12T17:16:48.103 に答える