ReactiveMongo FindAndModify Clarification

时间:2015-10-23 16:26:34

标签: mongodb reactivemongo

我的MongoDB数据库中有一个集合,上面有几个键。现在我想用一个新字段更新这个集合。所以这就是我到目前为止所做的:

  def confirm(hash: String) = {

    val myDb = dbConn.db(dbName)
    val userCollection = myDb[BSONCollection]("user")

    val selector = BSONDocument(idKey -> BSONObjectID(hash))
    val modifier =  BSONDocument(
      "$set" -> BSONDocument("date" -> BSONString(now.toString)) // Line 1
    )

    val command = FindAndModify(
      userCollection.name,
      selector,
      Update(modifier, fetchNewObject = true)
    )

    myDb.command(command)
      .map { user => // Line 2
      Right(bidList)
    }.recover {
      case LastError(ok,err, code, errMsg, _) =>
        Left(ServiceError(errMsg.getOrElse("failure!")))
    }
  }

上面的实现有两个问题:

第1行:这是否会使用名为date?的新字段更新现有文档?

第2行:映射myDb.command(命令)给了我一个选项[BSONDocument],但令我惊讶的是我在范围内有一个隐式转换。所以我原以为它会返回一个Option [User]!

2 个答案:

答案 0 :(得分:3)

您可以查看.findAndUpdateFindAndModifyResult,其中提供 if params[:publish] // your code elsif params[:draft] // your code end 操作,以根据可用的BSON读者获得结果。

.result

答案 1 :(得分:1)

我只是花了一些时间寻找play-reactivemongo等价物。也许这个例子将来会帮助某人。

val collectionFut: Future[JSONCollection] = reactiveMongoApi.database.map(_.collection[JSONCollection]("sale.numberingCounter"))

def updateIdx(nsId: NumberingSeriesId, month: Option[Int], year: Option[Int], value: Int): Future[Option[NumberingCounter]] = {
 val selector = Json.obj("numberingSeriesId" -> nsId, "month" -> month, "year" -> year)        
 val modifier = Json.obj("$set" -> Json.obj("idx" -> value))
    for {
      collection <- collectionFut
      writeResult <- collection.findAndUpdate(selector,modifier,upsert = true)
    } yield {
      writeResult.value.map(_.as[NumberingCounter])
    }
  }