如果我在 ReactiveMongo 中使用findAndUpdate命令,我应该使用什么http 请求。我的 CRUD 请求是这样路由的:
GET /api/1.1/r/:collName controllers.admin.MongoC.index(collName: String)
GET /api/1.1/r/:collName/:id controllers.admin.MongoC.read(collName: String, id: BSONObjectID)
POST /api/1.1/c/:collName controllers.admin.MongoC.create(collName: String)
PUT /api/1.1/u/:collName/:id/:many controllers.admin.MongoC.update(collName: String, id: BSONObjectID, many: Boolean)
DELETE /api/1.1/d/:collName/:id controllers.admin.MongoC.delete(collName: String, id: BSONObjectID)
我使用@cchantep 提供的这个答案来构造 findAndUpdate 命令(但采用 JSON 集合格式 - 因为我在 Play 框架中使用 JSON 插件),如下所示:
MongoRepo.scala
protected def getCollection(collName: String): Future[JSONCollection] = database.map(_.collection[JSONCollection](collName))
def findAndUpdate(collName: String)(selector: JsObject, update: JsObject, oProjection: Option[JsObject]): Future[Option[JsObject]] = {
getCollection(collName).flatMap(
_.findAndUpdate(selector, Json.obj("$set" -> update), fetchNewObject = true, upsert = true, fields = oProjection)
.map(_.result[JsObject])
)
}
控制器看起来像这样:
MongoC.scala
def getQueryParameterJSV(param: String) = { implicit request: Request[JsValue] =>
val oQueryStr = request.getQueryString(param)
oQueryStr match {
case Some(_) => Json.parse(oQueryStr.get).asInstanceOf[JsObject]
case None => Json.obj()
}
}
def findAndUpdate(collName: String, id: BSONObjectID) = Action.async(parse.json) { implicit request: Request[JsValue] =>
val q = getQueryParameterJSV("q")(request)
val p = getQueryParameterJSV("p")(request)
val doc = request.body.as[JsObject]
mongoRepo.findAndUpdate(collName)(q, doc, Some(p)).map(widget => Ok(Json.toJson(widget)))
}
和路线:
admin.routes
PUT /api/1.1/ur/:collName/:id controllers.admin.MongoC.findAndUpdate(collName: String, id: BSONObjectID)
我正在使用Postman进行测试,当我查询这个 URL 时,我得到了更新后的文档,因为它应该看起来但是查询集合我可以看到它仍然包含旧值。我的其他 CRUD 命令正常工作任何帮助/知识都会非常有用。谢谢