ReactiveMongo: Как да конвертирате BSON, върнат от FindAndModify, в JSON

Тук по-долу е кодът за актуализиране на документ с FindAndModify на Mongo:

val selector = BSONDocument("id" -> "1234")
val modifier = BSONDocument("$set" -> BSONDocument("email" -> "[email protected]"))    

ReactiveMongoPlugin.db.command(FindAndModify(
   collection.name,
   selector,
   Update(modifier, false),
   false,
   None
 )).transform(
   success => success.map { s =>
     // doesn't work...
     Json.fromJson[Seq[JsValue]](toJson(s)).map(for (item <- _) yield item).get
   }.getOrElse(List[JsValue]()),
   failure => failure match {
     case e: LastError => DaoServiceException(e.message, Some(DATABASE_ERROR))
   } 
)

В блока success се опитвам да преобразувам върнатата колекция BSONDocument в колекция JsValue... но не работи и получената колекция JsValue винаги е празна (проверих колекцията BSONDocument, върната от командата, и потвърждавам той е непразен). Изпускам ли нещо?


person j3d    schedule 09.02.2014    source източник
comment
Може би опитайте да използвате BSON Handler implicits от Play-ReactiveMongo за преобразуване от BSONDocument в JsObject? Предполагам, че те биха били най-добрият начин да направите това.   -  person millhouse    schedule 10.02.2014


Отговори (1)


Неявните манипулатори на BSON (предложени в коментар) може да не работят, защото командата FindAndModify има строг подпис за връщане на Option[BSONDocument]

FindAndModify extends BSONCommandResultMaker[Option[BSONDocument]]

като се има предвид, че върнатият резултат е от тип Future[Option[BSONDocument]]

можете да импортирате json форматите

import play.modules.reactivemongo.json.BSONFormats._

и кандидатствайте

result.map(docOpt => docOpt.map(d => Json.toJson(d)))

върху резултата или директно извикайте преобразуването

import play.modules.reactivemongo.json.BSONFormats

result.map(docOpt => docOpt.map(d =>
  BSONFormats.BSONDocumentFormat.writes(d).as[JsObject]))
person viktortnk    schedule 10.02.2014
comment
Успях да извърша атомно многократно актуализиране... но резултатът винаги съдържа един обект вместо колекция, съдържаща ВСИЧКИ стари стойности. Ако командата актуализира два документа, тогава бих очаквал BSONArray, съдържащ два записа... или греша? Сега съм малко изгубен. - person j3d; 11.02.2014
comment
Мисля, че сега разбирам... Мислех, че FindAndModify може да актуализира няколко документа наведнъж... но всъщност не е така. Той просто актуализира първия документ, който отговаря на критериите за избор. Колко жалко :-( - person j3d; 11.02.2014
comment
Сега той е отхвърлен, вместо това: import reactivemongo.play.json.BSONFormats.BSONDocumentFormat - person Quarktum; 06.01.2016