0
我擔心使用$彈出刪除MongoDB中的數組(嵌入式文件)的元素兩個主要的原因:
- 我不知道,如果數組的順序是靜態的。數組可以以不同的順序返回/存儲嗎?
- 如果在我刪除我的地址之前另一個用戶刪除了一個較小或相等值的索引,該怎麼辦?這會導致錯誤的數據被刪除。
我知道我可以使用$拉,但問題是,我可能不得不使用整個嵌入對象的criterea,我想能夠使用somesort的「uniqe足夠」(這可能是另一個問題完全)在處理嵌入對象時使用的標識符及其在陣列中的位置似乎是合乎邏輯的選擇。
如果使用$ pop確實是「不安全的」,我認爲有兩種可能的解決方案可用於「足夠獨特」的標識符。
- 在插入時爲每個嵌入對象添加一個MongoId的新實例。這個問題現在放寬$ set的功能,不插入重複條目。插入前您必須檢查重複項。
- json_encode新條目,然後md5散列那個json字符串。這可能是最好的解決方案,因爲它可以確保標識符對該記錄是唯一的,但是如果嘗試插入相同的條目,它確實仍然是相同的,所以$ set將忽略它。
所以我想我的問題是兩部分:從數組中刪除項目時使用$ pop是否安全?如果不是,爲嵌入式文檔添加足夠的唯一標識符的最佳做法是什麼?
(它可能是也可能不是相關的,我使用PHP)
在hainsight我的問題是誤導。流行只能刪除第一個或最後一個元素。你可以通過它在數組中的位置來取消設置元素,但是它只是將它設置爲null,因此你必須立即拖拽null元素。也就是說,你能解釋一下操作數組的「好方法」是什麼意思嗎?我喜歡你的「如果當前更新」策略的想法。 – Fatmuemoo 2011-06-10 20:10:55
對於好的方法,我的意思是順序不會被改變,除非你明確地反轉或者洗牌。 – Maxence 2011-06-11 07:09:54
在您檢索文檔的時間和要刪除元素的時間之間,文檔可能已被修改。可以在數組的開頭插入一個元素,並且您將刪除壞元素。因此,添加一個版本字段,在每次更改時增加它,並且當您使用未設置更新文檔時,將版本置於查找條件中。如果文檔已被修改,則更新將失敗。 – Maxence 2011-06-11 07:14:36