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

j3d*_*j3d 2 scala mongodb 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))
   } 
)
Run Code Online (Sandbox Code Playgroud)

success块我试图将返回的BSONDocument集合转换为JsValue集合...但它不起作用,结果JsValue集合总是空的(我已经验证BSONDocument了命令返回的集合,我确认它是非空的).我错过了什么吗?

vik*_*tnk 9

BSON处理程序含义(在注释中建议)可能不起作用,因为FindAndModify命令具有要返回的严格签名 Option[BSONDocument]

FindAndModify extends BSONCommandResultMaker[Option[BSONDocument]]
Run Code Online (Sandbox Code Playgroud)

给定返回的结果是Future[Option[BSONDocument]]类型

你可以导入json格式

import play.modules.reactivemongo.json.BSONFormats._
Run Code Online (Sandbox Code Playgroud)

并申请

result.map(docOpt => docOpt.map(d => Json.toJson(d)))
Run Code Online (Sandbox Code Playgroud)

结果,或直接调用转换

import play.modules.reactivemongo.json.BSONFormats

result.map(docOpt => docOpt.map(d =>
  BSONFormats.BSONDocumentFormat.writes(d).as[JsObject]))
Run Code Online (Sandbox Code Playgroud)

  • 现在它被弃用了,而不是:`import reactivemongo.play.json.BSONFormats.BSONDocumentFormat` (2认同)