Reactivemongo Insert(Map [String,String])

时间:2015-02-13 08:04:58

标签: mongodb scala reactivemongo

我有一个MongoDB集合,我想存储这样的文档:

{
    "_id" : ObjectId("52d14842ed0000ed0017cceb"),
    "details": {"name" : "Pankaj" , "email_id" :"abc@gmail.com"}
}

但不幸的是,这里插入mongo:

{
 "_id" : ObjectId("52d14842ed0000ed0017cceb"),
 "details" : { "name" : "\"Pankaj\"", "email_id" : "\"abc@gmail.com\""} 
}

为什么这个斜线进入mongo!如何删除此斜杠?

在我的代码“详情”商店Map[String,String]中。这是我插入文档的方式:

//BsonDocument
var document = BSONDocument()
details.foreach(e => {document = document.add(BSONDocument(e._1 -> BSONString(e._2)))
    }

2 个答案:

答案 0 :(得分:1)

您需要将需要插入的内容转换为 BSONObject 。否则,它将被视为 String

答案 1 :(得分:0)

对于ReactiveMongo 0.12,转换是自动的,但是提供的转换器仅支持将String类型作为键的简单不可变映射,因此请考虑这种情况需要额外推动以使用提供的ReactiveMongo转换器,如此样品:

  • 要存储m:Map [Long,String],您需要将其展平为(m.map {case(k,v)=>(k.toString - > v)})

  • 要存储m:选项[Map [String,String],您需要将其展平为m.getOrElse(Map())

  • 要存储m:collection.mutable.Map [String,String],您需要使用m.toMap()

  • 展平为不可变映射
  • 当然,如果你有:选项[collection.mutable.Map [String,String]你需要展平为m.getOrElse(Map())。toMap()

如果您使用旧版本的ReactiveMongo,或者您需要更专业的内容(或者您只想使用Scala类型),则可以使用自定义转换器,例如:

  def convertMapToBsonDocument[T](m: Map[String, T])(implicit writer: BSONWriter[T, _ <: BSONValue]): BSONDocument = {
    m.foldLeft(BSONDocument()) {
      case (doc, (key, value)) =>
        doc.merge(key -> writer.write(value))
    }
  }

注意:此自定义示例代码适用于ReactiveMongo 0.12,如果您使用的是旧版本,请尝试更改合并以添加或跳过隐式编写器直接将T声明为字符串(或你需要的课程/类别)

相关问题