Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Reactivemongo插入(映射[字符串,字符串])_Mongodb_Scala_Reactivemongo - Fatal编程技术网

Mongodb Reactivemongo插入(映射[字符串,字符串])

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" : "\"

我有一个MongoDB集合,我想在其中存储以下文档:

{
    "_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()

如果您使用的是旧版本的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))
    }
  }
def convertMapToBsonDocument[T](m:Map[String,T])(隐式writer:BSONWriter[T
文档合并(键->写入器写入(值))
}
}

注意:此自定义示例代码适用于ReactiveMongo 0.12,如果您使用的是旧版本,请尝试为add更改merge,或跳过将T直接声明为字符串(或所需的类)的隐式编写器

您正在插入一个
JSON字符串
,而不是一个子文档。您必须创建一个关联数组(javascript对象)才能插入子文档。否则它只会将其创建为
JSON字符串
您的字符串值中有
字符,无论出于何种原因与Mongo无关。