ReactiveMongo:如何将FindAndModify返回的BSON转换为JSON

时间:2014-02-09 22:42:34

标签: mongodb scala reactivemongo

以下是使用Mongo的FindAndModify

更新文档的代码
val selector = BSONDocument("id" -> "1234")
val modifier = BSONDocument("$set" -> BSONDocument("email" -> "new@domain.com"))    

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集合,并确认它是非空)。我错过了什么吗?

1 个答案:

答案 0 :(得分:9)

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]))