2013-04-17 187 views
4

我需要一種解決方法,因爲MongoDB不支持稀疏唯一複合索引(它將設置值爲null,如果不存在,而不會將該字段添加到索引時它是非複合指數)。見https://jira.mongodb.org/browse/SERVER-2193MongoDB解決方法不支持稀疏唯一複合索引

在我的特殊情況下,我有events。他們可以是一次性的或經常性的。我有一個字段parent,該字段僅在事件是重複事件的實例(我定期創建父系的新副本以在系統的未來幾周內發生重複事件)時才存在。

我以爲當的cronjob上面說的MongoDB作爲複合索引不支持sparse不幸的是運行兩次

events.ensureIndex({ dateFrom: 1, dateTo: 1, parent: 1 }) { sparse: true, unique: true } 

我只是爲了避免重複副本添加此指數。這意味着對於一次性事件,parent字段不存在,並且由MongoDB設置爲null。如果我現在同時有第二個一次性事件,它會導致一個重複的鍵錯誤,我只在設置父項時需要這個錯誤。

任何想法?

編輯:我見過MongoDB: Unique and sparse compound indexes with sparse values,但在應用程序級別檢查唯一性是一個不行。我的意思是這就是數據庫在那裏,保證的唯一性。

+0

可能的重複https://stackoverflow.com/questions/45675385/mongodb-compound-sparse-indexes – JohnnyHK

回答

0

您可以添加第4個字段,它將是dateFrom + dateTo + parent(字符串連接)。當父項爲空時,例如從ObjectId函數中選擇一個uid,然後索引該字段(唯一)。

這樣你就可以執行你想要的唯一性。但是,除了強制執行此約束之外,您幾乎不能使用它。 (雖然像「獲取文檔的字符串以blah等待開始」這樣的查詢可能非常高效)

+0

這不是很漂亮,但可能會奏效。然而,我確實通過向索引添加了更多特定於域的字段來使用另一種解決方法,這對我而言是有意義的。我還添加了事件的標題,這樣我就不會同時遇到兩個事件(我也添加了創建者/用戶)。 – Prinzhorn