Reactivemongo Вмъкване (Map[String,String])

Имам колекция MongoDB, където искам да съхранявам документи като този:

{
    "_id" : ObjectId("52d14842ed0000ed0017cceb"),
    "details": {"name" : "Pankaj" , "email_id" :"[email protected]"}
}

Но за съжаление тук вмъкнете в mongo така:

{
 "_id" : ObjectId("52d14842ed0000ed0017cceb"),
 "details" : { "name" : "\"Pankaj\"", "email_id" : "\"[email protected]\""} 
}

Защо тази наклонена черта идва в mongo! Как да премахна тази наклонена черта?

В моя код "подробностите" се съхраняват в Map[String,String]. И ето как вмъквам документ:

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

person panky    schedule 13.02.2015    source източник
comment
Вие вмъквате JSON string вместо sub document. Трябва да създадете асоциативен масив (javascript обект), за да вмъкнете поддокумент. в противен случай просто ще го създаде като JSON string   -  person Brian Noah    schedule 13.02.2015
comment
Имате " char във вашите низови стойности, независимо от причината, която не е свързана с Mongo.   -  person cchantep    schedule 13.02.2015


Отговори (2)


Трябва да конвертирате това, което трябва да вмъкнете в BSONObject. В противен случай ще се третира като Низ.

person Luong Ba Linh    schedule 31.07.2015

Що се отнася до ReactiveMongo 0.12, конвертирането е автоматично, но предоставените конвертори поддържат само прости неизменни карти с тип String като ключ, така че вземете под внимание тези случаи, които ще се нуждаят от допълнителен тласък, за да работят с предоставените конвертори на 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))
    }
  }

ЗАБЕЛЕЖКА: този персонализиран примерен код работи с ReactiveMongo 0.12, ако използвате по-стара версия, опитайте да промените сливането за добавяне или да пропуснете неявния писател, деклариращ T директно като String (или класа/класовете имате нужда)

person Carlos Saltos    schedule 25.05.2018