如何在响应mongo和播放中使用'$ in'查询'_id'

mcv*_*eat 5 scala mongodb playframework reactivemongo playframework-2.2

我有一个项目设置playframework 2.2.0play2-reactivemongo 0.10.0-SNAPSHOT.我想通过他们的id查询一些文档,方式类似于:

def usersCollection = db.collection[JSONCollection]("users")
val ids: List[String] = /* fetched from somewhere else */
val query = ??
val users = usersCollection.find(query).cursor[User].collect[List]()
Run Code Online (Sandbox Code Playgroud)

作为查询我试过:

Json.obj("_id" -> Json.obj("$in" -> ids))                        // 1
Json.obj("_id.$oid" -> Json.obj("$in" -> ids))                   // 2
Json.obj("_id" -> Json.obj("$oid" -> Json.obj("$in" -> ids)))    // 3
Run Code Online (Sandbox Code Playgroud)

第一个和第二个返回空列表,第三个失败,错误assertion 10068 invalid operator: $oid.

mcv*_*eat 0

我设法解决了这个问题:

val objectIds = ids.map(id => Json.obj("$oid" -> id))
val query = Json.obj("_id" -> Json.obj("$in" -> objectIds))
usersCollection.find(query).cursor[User].collect[List]()
Run Code Online (Sandbox Code Playgroud)

因为 play-reactivemongo 格式仅当“$oid”后跟字符串时才考虑 BSONObjectID

implicit object BSONObjectIDFormat extends PartialFormat[BSONObjectID] {
  def partialReads: PartialFunction[JsValue, JsResult[BSONObjectID]] = {
    case JsObject(("$oid", JsString(v)) +: Nil) => JsSuccess(BSONObjectID(v))
  }
  val partialWrites: PartialFunction[BSONValue, JsValue] = {
    case oid: BSONObjectID => Json.obj("$oid" -> oid.stringify)
  }
}
Run Code Online (Sandbox Code Playgroud)

尽管如此,我还是希望有一个更清洁的解决方案。如果没有,我想这会成为一个很好的拉取请求。