2

我有一个类似 JSON 的 scala 对象,由以下任何递归集合组成:scala.collection.Map[String,Any]、scala.collection.Seq[Any],以及基本类型:Int、Float、String、Double、Long、我通过 Web API 收到的。

如果我尝试使用(例如使用插入)直接将此对象喷射到 mongodb 中,则如果该对象是非集合类型的 map[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)
 ...
4

1 回答 1

0

将可变类型转换为 mongodb 时存在导致无限循环错误的问题,请参阅:SCALA-115 - Casbah 的下一个版本中将对此进行修复。

于 2013-12-12T15:39:11.933 回答