В Lift с MongoDB хранятся списки разнородных данных

Мне нужно сделать веб-сервис, который может содержать списки объектов. Один список может содержать объекты разных типов. Вот, например, у меня есть библиотека медиа-предметов. Каждый элемент может быть ссылкой или видео, каждый со своими метаданными.

Я хочу сделать это с веб-фреймворком Lift, потому что мне нужно что-то, что компилируется в WAR, и я раньше использовал Lift.

Я думал, что использование MongoDB для такого рода хранилища будет работать, так как по определению он должен обрабатывать коллекции разнородных элементов.

Я могу определить типы объектов BSON, которые будут храниться в записях Lift, но я не могу отказаться от создания только одного типа объектов в одной записи / коллекции. В идеале я хотел бы, чтобы каждая "вещь" (из-за отсутствия лучшего слова) в моей Библиотеке была либо видео, либо ссылкой. Например:

[
  {
    "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]

Как я могу получить это?

1 ответ

После поиска больше я нашел этот пост: https://groups.google.com/forum/

Это привело меня к такому выводу, который я считаю правильным, хотя он еще не проверен. Возможно, мне не хватает некоторых частей для его полной работы.

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 запись, которая представляет собой список классов дел. Кажется, это именно то, что мне нужно! Это сила Скалы и Монго, которые используются рука об руку! Это то, что я хотел с самого начала. Я должен попробовать это завтра.

Другие вопросы по тегам