在MongoDB中使用Salat时,处理compsite密钥的最佳方法是什么



我在MongoDB中使用Salat,并试图转换为自然键以避免数据库中的重复。我使用的案例类看起来有点像:

case class Foo(someRelatedId: String, email: String ...)

我想添加一个由someRelatedId+电子邮件组成的自然密钥,并让MongoDB使用它来代替默认的ObjectId。从文档中,我感觉这是可能的,但我仍在摸索一个可行的解决方案。我确信,这在很大程度上是由于我对Scala本身不够熟练。

更新:我现在有一个有效的解决方案,但我仍然想知道这是否是的最佳方式

case class Foo(someRelatedId: String, email: String, naturalKey: String)
object Foo {
  def apply((someRelatedId: String, email: String) {
    apply(someRelatedId, email, someRelatedId+email)
  }
}

然后在package.scala中,我映射到一个自定义的salat上下文:

implicit val ctx = new Context() {
  val name = Some("Custom Context")
}
ctx.registerGlobalKeyOverride(remapThis = "naturalKey", toThisInstead = "_id")

这样,我就避免了在域类中有一个强制性的(无意义的)_id字段,但我确实必须在伴随对象上重载apply(),这似乎有点笨拙。

main Salat开发者。

就像Milan建议的那样,为您的复合密钥创建一个案例类:

case class FooKey(someRelatedId: String, email: String)
case class Foo(@Key("_id") naturalKey: FooKey) {
  // use @Persist if you want these fields serialized verbatim to Mongo - see https://github.com/novus/salat/wiki/Annotations for details
  @Persist val email =  naturalKey.email
  @Persist val someRelatedId = naturalKey.someRelatedId
}
object FooDAO extends SalatDAO[Foo, FooKey](collection = /*  some Mongo coll */ )

如果您反对将"_id"作为字段名,则可以在上下文中使用全局覆盖将"_id"重新映射为"naturalKey",或者在每个对象上提供临时@Key覆盖。

我个人不喜欢在模型中给_id取不同的名称,因为Mongo查询必须使用序列化键"_id",而所有业务逻辑都必须使用case类字段名("naturalKey"或其他名称),而不是YMMV。

附言:我们的邮件列表在http://groups.google.com/group/scala-salat-我会比Stack Overflow更快地看到你的问题。

相关内容

  • 没有找到相关文章

最新更新