【发布时间】:2016-03-03 11:09:30
【问题描述】:
我有一个供用户使用的 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 错误(例如,如果第二个用户提供了匿名 ID 但没有用户 ID)。
因此,我尝试将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"}插入另一个用户,则应该会出现重复键错误
我还能如何做到这一点?
【问题讨论】:
-
您使用的是哪个版本的 MongoDB?
-
我使用的是 3.0.9。你问是因为部分索引吗?
-
确实如此。这是意图,将解决您的许多问题。如果可能的话,我会建议升级数据库引擎。