我有用户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