1

我需要制作一个可以包含对象列表的 Web 服务。一个列表可以包含多种类型的对象。例如,在这里,我有一个媒体项目库。每个项目可以是链接或视频,每个项目都有自己的元数据。

我想用 Lift web 框架来做这件事,因为我需要一些可以编译成 WAR 的东西,而且我以前用过 Lift。

我认为使用 MongoDB 进行这种存储会起作用,因为根据定义,它应该能够处理异构项目的集合。

我可以定义要存储在 Lift 记录中的 BSON 对象类型,但我似乎无法坚持在一个记录/集合中只创建一种类型的对象。理想情况下,我希望我的图书馆中的每个“事物”(因为没有更好的词)都是视频或链接。例如:

[
  {
    "type"       : "Video",
    "title"      : "Story",
    "videoID"    : "123ab4",
    "description": "Feature-length epic",
    "time"       : 12.6
  },
  {
    "type" : "link",
    "url"  : "http://www.google.com",
    "title": "Search for stuff"
  }
]

我应该能够使用正确的继承类型来做到这一点,但是所有记录对象的父母都从对象继承的方式让我失望。我可以让它工作吗?有一个Lift可以使用的不同东西的集合吗?

这是我到目前为止所拥有的。我还没有测试过它,但即使它有效,它的作用也不是我想要的。

import net.liftweb.record._
import net.liftweb.record.field._

import net.liftweb.mongodb._
import net.liftweb.mongodb.record._
import net.liftweb.mongodb.record.field._


class VideoShelf private () extends BsonRecord[VideoShelf] {
  def meta = VideoShelf

  object title       extends StringField (this, 256)
  object videoID     extends StringField (this, 32 )
  object description extends StringField (this, 256)
  object time        extends DecimalField(this, 0  )
}

object VideoShelf extends VideoShelf with BsonMetaRecord[VideoShelf]


class LinkShelf private () extends BsonRecord[LinkShelf] {
  def meta = LinkShelf

  object url   extends StringField(this, 128)
  object title extends StringField(this, 256)
}

object LinkShelf extends LinkShelf with BsonMetaRecord[LinkShelf]


class MediaLibrary private () extends MongoRecord[MediaLibrary] with ObjectIdPk[MediaLibrary] {
  def meta = MediaLibrary

  ///////////////////////////////////////
  ///////////////////////////////////////
  // What I want is this record type to
  // contain either of these:
  ///////////////////////////////////////      
  object videoshelf extends BsonRecordField(this, VideoShelf)
  object linkshelf  extends BsonRecordField(this, LinkShelf )
}

object MediaLibrary extends MediaLibrary with MongoMetaRecord[MediaLibrary]

我怎样才能得到这个?

4

1 回答 1

1

在寻求更多之后,我发现了这个帖子:https ://groups.google.com/forum/#!topic/liftweb/LmkhvDgrgrI

这使我得出了这个结论,我认为这是正确的,尽管它还没有经过测试。我可能会遗漏一些部分以使其充分发挥作用。

import net.liftweb.record._
import net.liftweb.record.field._

import net.liftweb.mongodb._
import net.liftweb.mongodb.record._
import net.liftweb.mongodb.record.field._


/**
 * The base record type for library objects.
 */
trait MediaLibrary[T <: MediaLibrary[T]] extends MongoRecord[T] with ObjectIdPk[T] {
  self: T =>
}

/**
 * Items in the library that are videos.
 */
class VideoItem extends MediaLibrary[VideoItem] {

  def meta = VideoItem

  object title       extends StringField (this, 256)
  object videoID     extends StringField (this, 32 )
  object description extends StringField (this, 256)
  object time        extends DecimalField(this, 0  )
}

object VideoItem extends VideoItem with MongoMetaRecord[VideoItem]

/**
 * Items in the library that are links.
 */
class LinkItem extends MediaLibrary[LinkItem] {

  def meta = LinkItem

  object url         extends StringField (this, 256)
  object title       extends StringField (this, 256)    
}

object LinkItem extends LinkItem with MongoMetaRecord[LinkItem]


更新

我还刚刚发现有一个特定于 MongoDB 的记录,它是一个案例类列表。这似乎正是我所需要的!这是 Scala 和 Mongo 的强大功能并驾齐驱!这就是我从一开始就想要的。我明天得试试。

于 2014-02-10T21:52:32.780 回答