2012-10-05 71 views
1

開頭的密鑰的對象我想保存對我的文檔所做的更改。最簡單的方法是存儲對文檔所做的實際更改。我的意思是什麼:

var changes = { 
    $set: { 
    text: 'Some text.' 
    } 
} 

db.posts.update({ 
    _id: _id 
}, changes) 

db.changes.insert({ 
    postid: _id, 
    changes: changes 
}) 

但是我得到的錯誤(有很好的理由):

Error: key $set must not start with '$' 

什麼是存儲變化的最簡單的方法?

或者我正在接近錯誤的問題,你有一個更好的解決方案。我希望用戶能夠看到人們對任何帖子所做的更改日誌,或者實際上任何事情。我不會爲每次改變都做一個功能。編輯文本只是對文檔進行更改的多種方法之一。

回答

1

這是MongoDB中的限制。由於如何查詢必須工作,有一些保留字符其中之一是$。使用操作員時,集合中的文檔與用於更新的文檔之間會有不明確的地方。

我建議剝離$符號。我反而用這句話來代替你要使用的運營商:

  • CREATE
  • SET
  • DELETE
+0

我必須爲每種類型的$修正,只有頂級的,或者這樣做什麼? –

+0

@JonathanOng沒有典型的審計日誌只有這三個操作符,你只是推入新的值和舊的值,諸如'$ inc'等東西就會以SET的形式出現。您需要考慮子文檔是否應以審覈日誌中的對象形式顯示,或者您是否想單獨審覈其中的每個字段。 – Sammaye

+1

我決定把它保存爲'JSON.stringify(更改)'。簡單! –

3

另一種選擇,有許多保留,是存儲你的改變記錄爲json字符串。當然,內容不會像搜索那麼容易,但是您可以保留將原始數據存儲爲字符串並在檢索時解碼json的簡單性。如果您只是存儲更改日誌,則此方法可能有效。

db.changes.insert({ 帖子ID:_id, 變化:JSON.stringify(變化) })