读取Casbah MongoDB查询的结果

3

我有一个 MongoDB 文档,长这样:

{"_id":"asdf", "data":[
    {"a":"1","b":"2"}, 
    {"a":"3","b":"4"}, 
    {"a":"5","b":"6"}, 
]}

我希望能用Scala查询该对象,并将"data"中的条目转换为一个case类列表。经过几个小时的努力,我甚至还没有编译出任何东西。有人能指点我一下这方面的教程吗?这篇教程没有任何帮助。我尝试了所有可能的嵌套映射、for循环、foreach循环、强制转换和模式匹配的组合。

编辑:我的代码丑陋无比,但现在似乎可以工作了:

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
}

请问,有没有更好的方法。

1个回答

1

由于您已经在使用案例类,最简单的解决方案是只需使用salat - 它会自动序列化/反序列化到Mongo连接,而且几乎没有任何模板代码。

一个小点,但是在您的代码中,您应该能够简单地map整个DBObject结构,而不是手动改变ret变量:

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

如果你真的需要一个List(尽管你可能只需要Seq或Iterable),那么你可能需要调用.toList。


BasicDBList 上没有 map 方法。也没有 toList 方法,其他地方有人建议使用。我是在使用错误的库还是怎么回事? - Ben Dilts
我正在查看MongoDBObject类,而不是Java驱动程序类。仔细看,实际上你需要mapResult,它接受一个接受Map的函数。你最好使用MongoDBObject作为源 - 至少它有getAs[T],所以你不需要手动转换。MongoDBList是定义toList(和toSeq,toStream等)的类。 - Jed Wesley-Smith
是的,我很想使用MongoDBObject,但不幸的是findOne().get似乎返回一个BasicDBObject,无法转换为MongoDBObject。 - Ben Dilts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接