Mongodb Reactivemongo插入(映射[字符串,字符串])
我有一个MongoDB集合,我想在其中存储以下文档:Mongodb Reactivemongo插入(映射[字符串,字符串]),mongodb,scala,reactivemongo,Mongodb,Scala,Reactivemongo,我有一个MongoDB集合,我想在其中存储以下文档: { "_id" : ObjectId("52d14842ed0000ed0017cceb"), "details": {"name" : "Pankaj" , "email_id" :"abc@gmail.com"} } { "_id" : ObjectId("52d14842ed0000ed0017cceb"), "details" : { "name" : "\"Pankaj\"", "email_id" : "\"
{
"_id" : ObjectId("52d14842ed0000ed0017cceb"),
"details": {"name" : "Pankaj" , "email_id" :"abc@gmail.com"}
}
{
"_id" : ObjectId("52d14842ed0000ed0017cceb"),
"details" : { "name" : "\"Pankaj\"", "email_id" : "\"abc@gmail.com\""}
}
但不幸的是,在mongo中插入如下内容:
{
"_id" : ObjectId("52d14842ed0000ed0017cceb"),
"details": {"name" : "Pankaj" , "email_id" :"abc@gmail.com"}
}
{
"_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)))
}
您需要将需要插入的内容转换为BSONObject。否则,它将被视为字符串。对于ReactiveMongo 0.12,转换是自动的,但提供的转换器仅支持简单的不可变映射,并将字符串类型作为键,因此请考虑这种情况,需要额外推送才能使用提供的ReactiveMongo转换器,如以下示例:
- 要存储m:Map[Long,String],需要将其展平为(m.Map{case(k,v)=>(k.toString->v)})
- 要存储m:Option[Map[String,String],需要将其展平为m.getOrElse(Map())
- 要存储m:collection.mutable.Map[String,String],需要使用m.toMap()将其展平为不可变映射
- 当然,如果您有一个m:Option[collection.mutable.Map[String,String],则需要将其展平为m.getOrElse(Map()).toMap()
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))
}
}
def convertMapToBsonDocument[T](m:Map[String,T])(隐式writer:BSONWriter[T
文档合并(键->写入器写入(值))
}
}
注意:此自定义示例代码适用于ReactiveMongo 0.12,如果您使用的是旧版本,请尝试为add更改merge,或跳过将T直接声明为字符串(或所需的类)的隐式编写器您正在插入一个
JSON字符串
,而不是一个子文档。您必须创建一个关联数组(javascript对象)才能插入子文档。否则它只会将其创建为JSON字符串
您的字符串值中有“
字符,无论出于何种原因与Mongo无关。