0

如果我在 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 命令正常工作任何帮助/知识都会非常有用。谢谢

4

0 回答 0