我有一个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)))
}
答案 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声明为字符串(或你需要的课程/类别)