mcv*_*eat 5 scala mongodb playframework reactivemongo playframework-2.2
我有一个项目设置playframework 2.2.0和play2-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.
我设法解决了这个问题:
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)
尽管如此,我还是希望有一个更清洁的解决方案。如果没有,我想这会成为一个很好的拉取请求。
| 归档时间: |
|
| 查看次数: |
4513 次 |
| 最近记录: |