我有用戶MongoDB的模式,它看起來是這樣的:MongoDB的可選唯一索引
{
userId: "some-string",
anonymousId: "some-other-string",
project: {"$oid": "56d06bb6d9f75035956fa7ba"}
}
用戶必須具有一個userId
或anonymousId
。由於用戶屬於一個項目,該模型還有一個名爲project
的引用,該引用鏈接到項目集合。
任何userId
或anonymousId
值必須是每個項目唯一的,所以我創建了兩個複合指標如下:
db.users.createIndex({ "userId": 1, "project": 1 }, { unique: true })
db.users.createIndex({ "anonymousId": 1, "project": 1 }, { unique: true })
然而,由於不能同時userId
和anonymousId
必須提供,但只是其中一方,MongoDB爲null
值拋出duplicate key
錯誤(例如,如果有第二個用戶提供了anonymousId但沒有userId)。
因此,我試圖給複合索引添加一個sparse: true
標誌,但這顯然只適用於兩個字段都爲空的情況。我也嘗試將稀疏標誌僅添加到字段而不是複合索引,但這也不起作用。
舉個例子,假設我有以下三個用戶集合中:
{ userId: "user1", anonymousId: null, project: {"$oid": "56d06bb6d9f75035956fa7ba"}}
{ userId: "user2", anonymousId: "anonym", project: {"$oid": "56d06bb6d9f75035956fa7ba"}}
{ userId: "user3", anonymousId: "random", project: {"$oid": "56d06bb6d9f75035956fa7ba"}}
下應該可以:
- 我希望能夠插入其它用戶
{userId: "user4", anonymousId: null}
對於同一個項目(沒有得到重複鍵錯誤) - 但是,如果我嘗試插入另一個用戶
{userId: "user3"}
或另一個用戶{anonymousId: "random"}
應該有一個複製te關鍵錯誤
我該怎麼做到這一點?
您使用的是什麼版本的MongoDB? – Saleem
我正在使用3.0.9。你是因爲部分索引而問的嗎? – benjiman
確實。這是意圖,並將解決您的許多問題。如果可能,我會建議升級數據庫引擎。 – Saleem