我在MongoDB中有一个文档如下:
{"_id":"asdf", "data":[
{"a":"1","b":"2"},
{"a":"3","b":"4"},
{"a":"5","b":"6"},
]}
我想使用Scala查询该对象,并将“data”中的条目转换为case类列表。 经过几个小时的工作,我还没有想出一些甚至可以编译的东西。有人能指点我这个信息的教程吗? This tutorial没有任何帮助。我已经尝试了我能想到的嵌套地图,fors,foreaches,casts和模式匹配的每种组合。
编辑:我现在看起来非常丑陋但看似正常的代码:
def getData(source_id:String) = {
val source = collection.findOne(MongoDBObject("_id" -> source_id)).get
val data = source.get("data").asInstanceOf[BasicDBList]
var ret:List[Data] = List()
val it = presses.iterator
while(it.hasNext) {
val item = it.next.asInstanceOf[BasicDBObject]
ret = Data(
item.get("a").asInstanceOf[String],
item.get("b").asInstanceOf[String]
) :: ret
}
ret
}
请有人告诉我有更好的方法。
答案 0 :(得分:1)
正如您正在使用案例类一样,最简单的解决方案是使用salat - 它将自动序列化/反序列化为mongo连接和非常少的样板。
一个小问题,但在您的代码中,您应该能够在DBObject保持结构中简单map
而不是手动改变ret
变量:
val ret = presses.map { item => Data(…) }
如果你真的想要一个List,你可能需要调用.toList(尽管你可能只需要Seq或Iterable)