关于mongodb:在play-salat中延迟加载集合

Lazyloading collection in play-salat

是否可以用Sala延迟加载集合?

例如我有一个像

这样的对象

示例1(在这种情况下,检索对象时将加载整个用户列表)

1
2
3
4
5
case class Test(
    @Key("_id") _id: ObjectId = new ObjectId,
    name: String,
    users: List[User]) {
}

或示例2(对象加载时没有列表,但是不知道如何获取用户列表)

1
2
3
4
5
case class Test(
    @Key("_id") _id: ObjectId = new ObjectId,
    name: String) {
    @Persist val users: List[User] = List()
}

如何在没有用户列表的第一个示例中加载对象?
或:如何在第二个示例中加载用户列表?

预先感谢!


这里是沙拉的作者。

Salat没有类似ORM的延迟加载功能。 @Persist注释旨在将字段保留在构造函数之外,但由于只对构造函数中的字段进行反序列化,因此可以抑制反序列化。

但是您可以在进行查询时轻松决定是否需要用户列表。

1
case class Test(@Key("_id") id = new ObjectId, name: String, users: List[User] = Nil)

您可以将用户作为嵌入式文档持久保存在测试文档中,然后使用查询的第二个参数ref在对象中排除(0)或包括(1)字段。

1
TestDAO.find(/* query */, MongoDBObject("users" -> 0))

另一种策略是将用户文档分解为一个子集合-有关更多信息,请参见https://github.com/novus/salat/wiki/ChildCollection。在此示例中,Test是"父级",User是"子级"。

这里的策略是在父DAO中进行保存时,您覆盖了save方法以使用子DAO保存用户,然后将users设置为Nil来保存父对象。

然后,默认情况下,在users设置为Nil的情况下检索Test实例。

如果要使用users检索Test,则需要向DAO中手动添加一个find方法:

  • 找到测试文件
  • 使用测试文档的_id字段按父ID查询用户文档-这将产生List[User]
  • 使用grater[Test]将测试文档反序列化为Test的实例,并将其与用户列表一起复制