У меня есть схемы 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 выбрасывает ошибку duplicate key
для значений null
(например, если есть второй пользователь с предоставленным анонимным, но без пользователя).
Поэтому я попытался добавить флаг 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