2013-03-01 49 views
-1

作爲Subset用戶,我想生成一個包含兩個點的Query,但是我不會在飛行中完成它。讓我提升你的博文例如http://osinka.github.com/subset/Subset+Query.html證明我要實現的,即使它沒有意義這樣的內容:如何通過osinka.subset實現MongoDB DBObject級聯點表示法

case class SubComment(subText: String) 
case class Comment(by: String, votes: Int, text: SubComment) 
case class BlogPost(title: String, comments: List[Comment]) 
object SubComment { 
    val text = "text".fieldOf[String] 
    implicit val writer = { 
     def f(sub: SubComment): DBObject = (text -> sub.subText) 
     ValueWriter(f _) 
    } 
    } 
    object Comment { 
    val by = "by".fieldOf[String] 
    val votes = "votes".fieldOf[Int] 
    val text = "text".fieldOf[SubComment] 
    } 
    object BlogPost { 
    val title = "title".fieldOf[String] 
    val comments = "comments".subset(Comment).of[List[Comment]] 
    } 
    val qComment = BlogPost.comments.where { _.by === "maria" } 
    val qSubComment = BlogPost.comments.where {…? === "X"} // not yet working 

我怎麼可能產生DBOBJECT { "comments.text.subText" : "X"}

謝謝, 彼得

回答

1

子集的作者,所以讓我參加一個簡短的彎路和解釋的細節。

子集(1.x)提供Field[T]以讀取和/或寫入/從MongoDB文檔(BSON)的字段。當你正在閱讀或寫作該領域的內容時,它唯一必須知道的是T。換句話說,如果您正在使用BSON文檔,則無論複雜的T是什麼(例如列表或子文檔),您都可以聲明所有字段爲"fieldName".fieldOf[T]

只要您需要創建查詢,情況就會變得更加複雜。由於MongoDB支持「點符號」,子集需要知道父文檔和後代字段之間的關係。當您將字段聲明爲"fieldName".subset(Obj).of[T]時,此目標就會完成。在這裏,T實際上與Obj根本沒有關係。 T用於通過子集序列化/反序列化字段內容,而Obj是簡單地用一個字段容器,子集必給你回當調用例如where

讓我來舉例說明。你需要在你的代碼改變的唯一事情是這樣的:

object Comment { 
    ... 
    val text = "text".subset(SubComment).of[SubComment] 
} 

,然後你會寫

scala> val q = BlogPost.comments.where { comment => 
    | comment.text.where { _.text === "X" } 
    | } 
q: com.osinka.subset.package.Query = Query{ "comments.text.text" : "X"} 

這裏,commentComment對象。


當你知道這一點,你可以自由地「欺騙」,並執行以下操作:

val comments = "comments".subset(()).of[List[Comment]] 
val commentText = "text".subset(()).of[SubComment] 
val subcommentInnerField = "inner".fieldOf[String] 

scala> comments.where { _ => 
    | commentText.where { _ => 
    |  subcommentInnerField === "X" 
    | } 
    | } 
res1: com.osinka.subset.package.Query = Query{ "comments.text.inner" : "X"} 

這裏我給Unit.subset()方法,因此,我們在where越來越Unit回來。但這並不重要,因爲我們知道在where調用中要使用哪些字段。這種「作弊」並不像將物體保持在物體內那樣「安全」,而是很好地證明了物體是如何連接的。

+0

太棒了!它工作,我喜歡它。 – 2013-03-01 09:42:42

+0

我很高興聽到!那麼請接受答案 – 2013-03-04 13:34:43