【问题标题】:ReactiveMongo: How to convert BSON returned by FindAndModify to JSONReactiveMongo:如何将 FindAndModify 返回的 BSON 转换为 JSON
【发布时间】:2023-03-08 08:34:01
【问题描述】:

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

【问题讨论】:

  • 也许尝试使用 Play-ReactiveMongo 中的BSON Handler implicitsBSONDocument 转换为JsObject?我想他们将是做到这一点的最佳方式。

标签: mongodb scala reactivemongo


【解决方案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]))

【讨论】:

  • 我能够执行原子多重更新...但结果始终包含一个对象,而不是包含所有旧值的集合。如果该命令更新了两个文档,那么我希望 BSONArray 包含两个条目......还是我错了?我现在有点迷路了。
  • 我想我现在明白了……我以为 FindAndModify 能够一次更新多个文档……但实际上并没有。它只是更新与选择标准匹配的第一个文档。真可惜:-(
  • 现在已弃用,取而代之的是:import reactivemongo.play.json.BSONFormats.BSONDocumentFormat
猜你喜欢
  • 1970-01-01
  • 2015-10-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
相关资源
最近更新 更多