Быстрый способ вставить структурированный объект Map[String,Any] в mongodb

У меня есть объект scala, подобный JSON, состоящий из любой рекурсивной коллекции: scala.collection.Map[String,Any], scala.collection.Seq[Any], а также основные типы: Int, Float, String, Double, Long, который я получаю через веб-API.

Если я попытаюсь напрямую ввести этот объект в mongodb с помощью (например, с помощью вставки), он сработает, если объект представляет собой карту [String, _] для типов, не входящих в коллекцию. Но если значения карты сами по себе являются коллекциями, то библиотека драйверов mongodb теряет рассудок и переходит в бесконечный цикл (переполнение стека). Как правильно взять такой объект и поместить его в MongoDB.

(Есть casbah, но выглядит в основном полезно для постепенного создания объекта, а не для преобразования существующего объекта).

Вот неудачный пример:

val obj2= scala.collection.mutable.HashMap[String,Any]()
obj2 += ("a" -> 123)

val obj1= scala.collection.mutable.HashMap[String,Any]()    
obj1 += ("x" -> List(obj2) )    

val anyMapLike:scala.collection.Map[String,Any] = obj1
collection.insert( anyMapLike )   // Stack overflow here!

... сходит с ума в:

 java.lang.StackOverflowError: null
    at scala.collection.convert.Wrappers$MutableMapWrapper.underlying(Wrappers.scala:216)
    at scala.collection.convert.Wrappers$MutableMapWrapper.productElement(Wrappers.scala:216)
    at scala.runtime.ScalaRunTime$$anon$1.next(ScalaRunTime.scala:185)
 ...
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
    at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295)
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
    at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295)
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
    at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295)
 ...

person user48956    schedule 27.09.2013    source источник
comment
Можете ли вы привести пример карты, которая вызывает проблемы?   -  person Ross    schedule 27.09.2013
comment
С удовольствием. Обновил выше.   -  person user48956    schedule 27.09.2013


Ответы (1)


Возникла проблема с преобразованием изменяемых типов в mongodb, которая вызвала ошибку бесконечного цикла, см.: SCALA-115 - исправление будет в следующем релизе Casbah.

person Ross    schedule 12.12.2013