[英]In Lift with MongoDB, storing lists of heterogeneous data
我需要制作一個可以包含對象列表的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]
我怎么能得到這個?
尋找更多信息后,我發現了這篇文章: 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攜手使用的強大功能! 那就是我從一開始就想要的。 我明天必須嘗試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.