Вложенные поля в mongodb Документы со скалами - PullRequest
0 голосов
/ 22 мая 2018

При обновлении соединения mongodb из приложения scala с Mongodb + Casbah до mongo-scala-driver 2.3.0 (scala 2.11.8) мы сталкиваемся с некоторыми проблемами при создании Документов для вставки в БД.В основном я сталкиваюсь с проблемами с вложенными полями типа Map [String, Any] или Map [Int, Int].

Если мое поле имеет тип Map ["String", Int], проблем нет, и код не скомпилирует без проблем:

val usersPerPage = Map("home" -> 23, "contact" -> 12) //Map[String,Int]
Document("page_id" -> pageId, "users_per_page" -> Document(usersPerPage))  
//Compiles 

val usersPerTime = Map(180 -> 23, 68 -> 34) //Map[Int,Int]
Document("page_id" -> pageId, "users_per_time" -> Document(usersPerTime)) 
//Doesn't compile

val usersConf = Map("age" -> 32, "country" -> "Spain") //Map[String,Any]
Document("user_id" -> userId, "user_conf" -> Document(usersConf)) 
//Doesn't compile

Я пробовал много обходных путей, но яне удалось создать целый документ для вставки с полями типа Map [Int, Int] и Map [String, Any], я подумал, что при обновлении до более новой версии Mongo все упростится ... что мне не хватает?

1 Ответ

0 голосов
/ 22 мая 2018

Имейте в виду, что тип Map[Int,Int] не является допустимой картой документов, так как Документы имеют формат
k,v -> String, BsonValue.

Таким образом, это скомпилирует:

val usersPerTime = Map("180" -> 23, "68" -> 34) //Map[String,Int]
Document("page_id" -> pageId, "users_per_time" -> Document(usersPerTime)) 

В обоих случаях сделайте это напрямую с классом Document вместо Map:

val usersConf = Document("age" -> 32, "country" -> "Spain") 
Document("user_id" -> userId, "user_conf" -> usersConf) 

Это хорошо работает с "org.mongodb.scala" %% "mongo-scala-driver" % "2.1.0"

...