2011-03-10 120 views
3

我對MongoDB相當陌生,並試圖用它構建一個嵌套註釋系統。 在網上你發現各種文檔的結構來實現這一點,但我正在尋找一些建議,這將使我容易與意見做以下的事情MongoDB中的嵌套註釋

  • 馬克評論爲垃圾郵件/批准和檢索本評論屬性
  • 用戶
  • 檢索意見檢索評論計數的對象/用戶

當然除了顯示評論,因爲它是正常完成的。如果您有任何關於如何使用MongoDB處理這些事情的建議 - 或者 - 告訴我尋找一個替代方案,那麼我們將會非常感激!

回答

1

由於您需要通過某些屬性,用戶等來檢索註釋,因此您無法在用戶可評論的每個對象中嵌入(嵌入對文檔數據庫的嵌入速度始終更快)。所以你需要爲評論創建單獨的集合。我建議以下結構:

comment 
{ 
    _id : ObjectId, 
    status: int (spam =1, approved =2), 
    userId: ObjectId, 
    commentedObjectId: ObjectId, 
    commentedObjectType: int(for example question =1, answer =2, user =3), 
    commentText 
} 

有了你可以很容易做的事情。這是你上面的結構要:

//Mark comments as spam/approved and retrieve comments by this attributes 
//mark specific comment as spam 
db.comments.update({ _id: someCommentId }, { status: 1 }, true); 
db.comments.find({status : 1});// get all comments marked as spam 

//Retrieve comments by user 
db.comments.find({'_userId' : someUserId}); 

//Retrieve comment count for an object/user 
db.comments.find({'commentedObjectId' : someId,'commentedObjectType' : 1 }) 
      .count(); 

此外,我想徵求意見計數會更好中的每個對象和inc它來創建額外的域在評論添加/刪除。

+0

我會接受你的答案,如果沒有人提出更好的東西。我知道這將是一個嵌入與單獨收集之間的決定,但我也在考慮諸如在文檔中嵌入評論和單獨存儲在文檔中哪些文檔被認爲是垃圾郵件等解決方案。另一種解決方案可能不會嵌套他們在文檔中,但存儲一些物化路徑與他們... – 2011-03-10 21:08:18

1

您是否考慮過在需要引用它們的所有文檔中存儲註釋?如果您有該用戶的文檔,請將該用戶的所有評論存儲在該文檔中。如果您有單獨的對象文檔,請將所有評論存儲在那裏。從關係型世界中獲得一個給定的數據,然後通過ID引用它,但是即使使用關係型數據庫,如果您希望查詢運行,您也必須開始複製數據很快。

使用此設計,您加載的每個文檔都將是「完整的」。它將擁有您需要的所有數據,並且該集合上的索引將保持快速讀取。價格會稍微慢一些,因爲您需要更新多個文檔,所以當您需要更新評論文本時,價格會更低。

+0

也是一個不錯的方法,因爲每個解決方案可能有相同數量的優點和缺點也爲你+1! – 2011-03-10 23:33:15