2016-09-06 100 views
0

我們想在我們當前的項目中應用一些審覈。爲此,我們創建了一個場景,但我看不到如何使原子的點數爲和。MongoDB:驗證文檔未更新

方案

每個文檔都必須有一個timestamp是將服務器 一個版本。當保存文檔,我們將:

  1. 驗證文件沒有改變 -首先比較的最新文件的timestampsdocLatest 與我們想用來存儲docUpdated文檔。 timestamps必須相等。
    • 如果不是,保存請求被拒絕。
    • 如果可以,轉到下一點。
  2. 更新文檔
  3. 與以前的文檔創建差異 -最新的文檔必須是我們的最後 文件。我們將創建一個差異並存儲它。

回答

1

我偶然發現了這個想法。我的想法將利用long_polling技術。我不打算告訴你如何構建數據,但可以將日期轉換爲數值,然後再進行比較。

爲1和2,你可以轉換日期,格式爲數字,該模式將類似於下面:

var document= { 
    updatedAt: { type: Number, default: Date.parse(new Date()) } 
} 

然後提交客戶每一份文件,只是檢查,如果

if(latestDocument.updatedAt - prevDocument.updatedAt > 0) { 
    //if latest's timestamp is bigger than prev, then store it in mongodb 

} else { 
    //if latest document is the same or even older, just ignore this document 
} 

爲3號。我發現,如果文檔已經改變,你甚至需要區別嗎?我決定遵循反應/助焊劑的方法,如果文檔已經改變,只需更換整個文檔。

+0

Thx vdj4y!我需要區分它。我們將使用差異來審計日誌。 我踩了一個更自然的解決方案mongoDb。看看http://mongoosejs.com/docs/guide.html並搜索'option:versionKey'。它爲樂觀鎖定做好了準備。在我的情況下,它會用'__v'代替'timestamp',它是一個簡單的非負數。但我不能讓'__v'出現在我的任何文檔中...... – zatziky

+0

很酷,這非常有趣。雖然在你的情況下,我認爲這是毫無意義的,因爲我認爲你想檢查當前文檔是否是最新的,然後用最新的時間戳替換舊值(以取代不增加它),所以鎖定可能不需要,除非你計劃是增加版本。乾杯 – vdj4y