2011-06-02 82 views
3

首先說我是MongoDb和麪向文檔的db的新手。MongoDB(PHP) - 自定義「id」和OrderWith編號

在mongodb中嵌入文檔出現問題後(無法只選擇嵌套文檔(例如博客文章中的單個評論)), 我重新設計了db。現在我有兩個集合,文章和評論(不是真正的交易,爲了方便起見使用博客示例)。

示例 - 帖子收集文件:

陣{

'_id' : MongoId, 

'title' : 'Something', 

'body' : 'Something awesome' 

}

示例 - 註釋文檔:

陣{

'_id' : MongoId, 

'postId' : MongoId, 

'userId' : MongoId, 

'commentId' : 33, 

'comment' : 'Punch the punch line!' 

}

正如你所看到的,我有多個評論文檔(正如我之前所說的,我希望能夠選擇單個評論,而不是他們的數組)。

我的計劃是這樣的:我想從使用postId和commentId的集合中選擇單個評論(commentId是僅具有相同postId的評論中的唯一值)。 哦和commentId需要是一個整數,這樣我才能夠使用該值計算下一個和前一個文檔,排序「orderWith」數字。

現在我能得到這樣的評論:

URI:mongo.php後= 4de526b67c​​dfa94f0f000000 &評論= 4

代碼:$評論= $收藏 - > findOne(陣列( 「帖子ID」 => $ theObjId,「commentId」=>(int)$ commentId));

我有幾個問題。

  1. 我在做對吧?
  2. 什麼是生成這種commentId的最佳方式?
  3. 確保commentId在具有相同postId(upsert?)的評論中獨一無二的最佳方法是什麼?
  4. 如何處理併發查詢?

回答

3

我在做對吧?

這是一個非常困難的問題。它工作嗎?它是否滿足您的性能需求,您是否願意維護它?

MongoDB沒有任何「標準化」或「一個真正的方式」的概念。您可以以適合您的方式爲您的數據建模。

什麼是最好的方式來產生這種commentId? 確保commentId在具有相同postId(upsert?)的評論中獨一無二的最佳方法是什麼?

這確實是一個複雜的問題。如果你想產生單調遞增的整數ID(比如自動遞增),那麼你需要一箇中央權威來產生這些整數。這並不會很好地擴展。

通常建議的方法是使用ObjectId/MongoId。這會給你一個唯一的ID。

但是,你真的想要一個整數。所以看看findAndModify。您可以在自己的帖子上保留「last_comment_id」,然後在創建新評論時進行更新。

如何處理併發查詢?

爲什麼併發查詢會成爲問題?兩位讀者應該能夠訪問相同的數據。

您是否擔心正在創建併發評論?然後請參閱查找修改文檔。

+0

@Gates和@Earlz 感謝您的幫助,但最終我將使用ref和MongoId。 – 2011-06-03 19:36:16

+0

哇...我不知道評論有5分鐘的窗口編輯:( 這是其餘的前一個。 @蓋茨和@埃爾茲 感謝您的幫助,但最後我要去在MongoId中使用ref,Post文件將有一個mongoids數組引用不同集合中的註釋,Mongo的「自動遞增」數組鍵將作爲整數使用,我想我可以排序並選擇上一個和下一個元素。 – 2011-06-03 19:49:52

+2

嗯,我沒有明白爲什麼你將這些註釋存儲在一個單獨的集合中,這從面向doc的(非關係的)觀點來看沒有任何意義,並且與MongoDB的概念背後的想法有些矛盾。在您的帖子集合中引用MongoIds數組並沒有任何意義,因爲這會導致性能下降和可怕的維護狂歡,而不是在進一步的數據庫重新設計上浪費精力......也許提出另一個關於嵌入的「麻煩」問題是個好主意。我相信有合適的解決方案...;) – proximus 2011-06-03 20:21:47

2

我不知道大圖可以讓你做到這一點,但這是我該怎麼做。

我會在每篇文章中包含一系列評論。這意味着不需要連接。在你的情況下,評論標準化不會帶來任何好處。我會用CreatedAt替換CommentID作爲創建時間。

這可以讓你有一個簡單的數據模型來處理,以及對它進行排序的能力。