Разъяснение ReactiveMongo FindAndModify

У меня есть коллекция в моей базе данных 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: обновит ли это существующий документ новым полем с именем дата?

В строке 2: сопоставление myDb.command(command) дает мне Option[BSONDocument], но я удивлен, что у меня есть неявное преобразование в области видимости. Поэтому я ожидал, что он вернет Option[User]!


person joesan    schedule 23.10.2015    source источник
comment
Вы не указываете, какие версии вы используете. В RM 0.11.7 у вас есть операция сбора .findAndUpdate.   -  person cchantep    schedule 24.10.2015
comment
Это ReactiveMongo 0.11.7 против MongoDB 3.0.6.   -  person joesan    schedule 24.10.2015
comment
Вы можете посмотреть .findAndUpdate   -  person cchantep    schedule 24.10.2015
comment
... и FindAndModifyResult который обеспечивает операцию .result для получения результата в соответствии с доступными читателями BSON.   -  person cchantep    schedule 24.10.2015
comment
1. Упомянутая операция .findAndUpdate (не .findAndModify). 2. Сказать, что API недостаточно просто потому, что API не является чистым, просто неконструктивно. Вы можете разработать усовершенствование.   -  person cchantep    schedule 24.10.2015
comment
Я посмотрю findAndUpdate! Спасибо за предложение! Я просто регистрировал свои комментарии и не пытался быть невежливым!   -  person joesan    schedule 24.10.2015


Ответы (2)


Вы можете посмотреть .findAndUpdate и FindAndModifyResult который обеспечивает операцию .result для получения результата в соответствии с доступными читателями BSON.

val person: Future[Option[AType]] = collection.findAndUpdate(
  BSONDocument("name" -> "James"),
  BSONDocument("$set" -> BSONDocument("age" -> 17)),
  fetchNewObject = true).map(_.result[AType])
person cchantep    schedule 24.10.2015
comment
какую версию API вы используете? Если я попробую ваш пример, я не получу Future[BSONDocument] обратно? Я использую версию 0.11.7 в API ReactiveMongo. - person joesan; 24.10.2015

Я только что потратил некоторое время на поиск 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])
    }
  }
person mgosk    schedule 21.02.2017
comment
Спасибо за попытку! - person joesan; 21.02.2017