Scala 读取Casbah MongoDB查询的结果

Scala 读取Casbah MongoDB查询的结果,scala,mongodb,casbah,Scala,Mongodb,Casbah,我在MongoDB中有一个文档如下所示: {"_id":"asdf", "data":[ {"a":"1","b":"2"}, {"a":"3","b":"4"}, {"a":"5","b":"6"}, ]} 我想使用Scala查询该对象,并将“data”中的条目转换为case类列表。经过几个小时的工作,我还没有想出一些甚至可以编译的东西。有人能给我指一个有这些信息的教程吗?没有任何帮助。我尝试了我能想到的嵌套贴图、fors、foreaches、cast和模式匹配

我在MongoDB中有一个文档如下所示:

{"_id":"asdf", "data":[
    {"a":"1","b":"2"}, 
    {"a":"3","b":"4"}, 
    {"a":"5","b":"6"}, 
]}
我想使用Scala查询该对象,并将“data”中的条目转换为case类列表。经过几个小时的工作,我还没有想出一些甚至可以编译的东西。有人能给我指一个有这些信息的教程吗?没有任何帮助。我尝试了我能想到的嵌套贴图、fors、foreaches、cast和模式匹配的所有组合

编辑:我的超级丑陋,但现在似乎工作的代码是:

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
}

请有人告诉我有更好的方法。

因为您无论如何都在使用case类,最简单的解决方案就是直接使用它——它将自动序列化/反序列化mongo连接和来自mongo连接,只需很少的样板文件

这是一个次要问题,但在代码中,您应该能够简单地
映射
整个DBObject持有结构,而不是手动修改
ret
变量:

val ret = presses.map { item => Data(…) }

如果您确实想要一个列表,您可能需要调用.toList(尽管您可能只需要Seq或Iterable)

基本列表上没有map方法。也没有其他人建议的托利斯特方法。我使用的是错误的库还是什么?我在看MongoDBObject类,而不是java驱动程序类。仔细看,您实际上需要mapResult,它传递一个函数,该函数接受一个Map。您最好使用MongoDBObject作为源代码,因为它至少有getAs[T],所以您不需要手动强制转换。MongoDBList是定义toList(以及toSeq、toStream等)的类。是的,我很想使用MongoDBObject,但不幸的是findOne()。get似乎返回一个BasicDBObject,它无法转换为MongoDBObject。