【问题标题】:How to specify salat DAO model for nested list of mixed type?如何为混合类型的嵌套列表指定 salat DAO 模型?
【发布时间】:2013-02-14 09:26:34
【问题描述】:

我从 MongoDB 返回的数据如下所示:

> db.foo.findOne()
[
    {
        "_id" : "some string",
        "bar" : [
            [
                14960265,
                0.5454545454545454
            ],
            [
                30680,
                0.36363636363636365
            ],
            [
                12852625,
                0.09090909090909091
            ]
        ],
    }
]

bar 属性包含一个未知大小的列表,其中每个项目都是一个长度为 2 的列表,其中包含一个 Int 和一个 Double。在 Scala 中,我将其表示为 List[(Int, Double)]。

我将如何为这个结构编写模型以与 Salat 一起使用?

Salat 不做元组,所以我尝试了:

case class FooEntry(a: Int, b: Double)
case class Foo(_id: String, bar: List[FooEntry])

但是得到了:

java.lang.IllegalArgumentException: BasicBSONList 只能使用 数字键,不是:[a]

也试过了:

case class Foo(_id: String, sps: List[Any])

但是得到了:

java.lang.ClassCastException: com.mongodb.BasicDBList 无法强制转换 到 scala.collection.immutable.List

显然,数据可以以更好的形式存储,使用对象而不是长度为 2 的数组。但鉴于这就是我所拥有的,有没有一种使用 Salat 反序列化它的好方法?谢谢!

【问题讨论】:

    标签: mongodb scala serialization casbah salat


    【解决方案1】:

    Salat 项目负责人在这里。无论您的数据结构是什么,您都需要为列表指定一个类型。 Salat 还不支持元组,虽然 Salat 支持多态集合(这需要类型提示!),但它不支持像你这样的异构类型列表。

    你能否重组你的数据,使数组成员不是列表而是

    [
      {x: 123, y: 123.0}, 
      {x: 456, y: 456.0}
    ]
    

    那么你可以使用

    case class Bar(x: Long, y: Double)
    case class Foo(_id: String, sps: List[Bar])
    

    或者,考虑尝试使用 Miles Sabin 的 Shapeless 项目或 Alois Cochard 的 Sherpa 项目来反序列化您的数据。

    【讨论】:

    • 非常感谢您的解释和替代方案的指针。我同意将数组成员表示为对象而不是数组。
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2016-10-29
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多