2011-08-06 72 views
4

我在工作中有一個應用程序,用於在我工作的公司內部用作項目/任務跟蹤器。玩MongoDB atm。我有以下假模式:Python + MongoDB文檔版本

task 
    _id 
    name 
    project 
    initial_notes 
    versions 
     number 
     versions 
      version_1 
       worker 
       status 
       date(if submitted) 
       review_notes(if rejected) 
       reply_on(if accepted/rejected) 
      (version_n)(if any) 

我遇到的問題是版本化任務。我已經閱讀了一些可能的方法,但我沒有完全理解它們。我讀到的東西,我喜歡here,真正喜歡的方式mongoid確實是它versioning

思考更好,我寧願它是這樣的

task 
    _id 
    versions 
     number_of_versions: 3 
     current_version 
      version_no: 3 
      worker: bob 
      status: accepted 
     old_versions 
      version 
       version_no: 2 
       worker: bob 

我想只顯示最新版本當顯示一組任務時,我想在進入該特定任務的詳細信息頁面時顯示特定任務的所有版本。這個結構會起作用嗎?如果是,那麼爲了實現我所需要的,需要運行一些查詢?

預先感謝您花時間閱讀本文,也許可以回答。 狀態:拒絕 版本 version_no:1名 工人:史密斯 狀態:拒絕

回答

4

是的,爲什麼不呢?該計劃將起作用。另外,你有沒有考慮這樣的事情:

task 
    ... 
    versions = [  # MongoDB array 
     { version_id 
      worker 
      status 
      date(if submitted) 
      review_notes(if rejected) 
      reply_on(if accepted/rejected) 
     }, 
     { version_id : ... }, 
     ... 

可能的版本插入查詢:

tasks.update({ # a query to locate a particular task}, 
       { '$push' : { 'versions', { # new version } } }) 

。注意,獲取在這種情況下,版本陣列的最後一個版本是由程序完成的,而不是由蒙戈。

+0

所以檢索整個數組並循環通過它決定哪個是最新的並顯示它?它會比其他模式有什麼優勢嗎?在第一個版本中,我可以針對大量任務db.task.findOne({},name:1,...,versions.current_version:1)嗎?考慮到數據庫不會那麼大,訪問時間不會有問題,但如果我需要將此模式應用於更大規模(不同的應用程序),我要求將來參考 – pocorschi

+0

如果您希望每個版本的快速增長每一個任務,你都應該把版本保存在一個單獨的集合中。雖然這可能聽起來像「sql-way」一樣,但Mongo DB的文檔鼓勵它:http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-UseCase –

+0

版本應該在5-6範圍內最大。仍然不確定我是否應該按照我的方式或你的建議。這裏有一個微妙的差異,但我看不出它是正面還是負面 – pocorschi

3

你也可以考慮這樣的模式:

task 
    _id 
    ... 
    old_versions [ 
     { 
      retired_on 
      retired_by 
      ... 
     } 
    ] 

這樣做的好處是你目前的數據總是在最頂層(您無需明確跟蹤當前的版本中,該文件是它自己的當前版本),並且您可以通過採用當前版本輕鬆跟蹤歷史記錄,將old_versions字段和$push刪除到db中的old_versions字段。

既然你似乎想要儘量減少網絡IO,這也可以讓您輕鬆避免加載old_versions當你不需要他們:

> db.tasks.find({...}, {old_versions: 0}) 

你也可以得到發燒友和存儲舊版本的列表只有已經改變的字段。這需要在應用程序層使用更精密的代碼,如果您不希望進行很多修訂或者這些文檔非常大,則可能不需要。