2015-10-23 2 views
1

У меня есть коллекция в моей базе данных MongoDB с несколькими ключами. Теперь я хочу обновить эту коллекцию новым полем. Так вот, что я до сих пор:ReactiveMongo FindAndModify Уточнение

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!"))) 
    } 
    } 

У меня есть две проблемы, связанные с реализацией выше:

On Line 1: Будет ли это обновление существующего документа с новым полем называется дата?

On Line 2: Сопоставление команды myDb.command (команда) дает мне опцию [BSONDocument], но меня удивляет то, что у меня есть неявное преобразование в сфере видимости. Поэтому я ожидал, что он вернет опцию [Пользователь]!

+0

Вы не указали, какие версии вы используете. В RM 0.11.7 у вас есть операция коллекции '.findAndUpdate'. – cchantep

+0

Это ReactiveMongo 0.11.7 против MongoDB 3.0.6 – sparkr

+0

Вы можете посмотреть [.findAndUpdate] (http://reactivemongo.org/releases/0.11/api/index.html#[email protected] findAndUpdate [Q, U]% 28selector: Q, обновление: U, fetchNewObject: Boolean, upsert: Boolean, сортировка: Опция [GenericCollection.this.pack.Document], поля: Опция [GenericCollection.this.pack.Document]% 29 % 28implicitselectorWriter: GenericCollection.this.pack.Writer [Q], implicitupdateWriter: GenericCollection.this.pack.Writer [U] implicitec: scala.concurrent.ExecutionContext% 29: scala.concurrent.Future [GenericCollection.this.BatchCommands.FindAndModifyCommand .FindAndModifyResult]) – cchantep

ответ

3

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

val person: Future[Option[AType]] = collection.findAndUpdate(
    BSONDocument("name" -> "James"), 
    BSONDocument("$set" -> BSONDocument("age" -> 17)), 
    fetchNewObject = true).map(_.result[AType]) 
+0

, какую версию API вы используете? Если я попробую ваш пример, я не получу будущее [BSONDocument] назад? Я использую версию 0.11.7 на ReactiveMongo API – sparkr

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]) 
    } 
    } 
+0

Спасибо за внимание! – sparkr