Во-первых, вы, безусловно, можете вставить логику представления в код своего приложения - все, что вам нужно, - это соответствующая система сборки или развертывания, которая извлекает представления из приложения и добавляет их в проектный документ. Чего не хватает, так это возможности генерировать новые запросы на лету.
Ваш emit(doc.field,null)
подход, конечно, не удивителен или необычен. Фактически это обычный шаблон для запросов «найти документ по полю», когда документ извлекается с использованием include_docs=true
. Также нет необходимости смешивать два представления в одно, единственное решение, связанное с производительностью, заключается в том, следует ли размещать два представления в одном и том же проектном документе: все виды в проектном документе обновляются при доступе к любому из них.
Конечно, ваш подход на самом деле не гарантирует, что электронные письма уникальны, даже если ваше приложение очень старается. Представьте себе следующие обстоятельства с двумя клиентскими приложениями A и B:
A: queries view, determines that `test@email.com` does not exist.
B: queries view, determines that `test@email.com` does not exist.
A: creates account with `test@email.com`
B: creates account with `test@email.com`
Это редкое явление, но тем не менее возможно. Лучшим подходом является сохранение документов, использующих адрес электронной почты в качестве ключа, поскольку доступ к отдельным документам является транзакционным (невозможно создать два документа с одним и тем же ключом). Типичный пример:
{
_id: "test@email.com",
type: "email"
user: "000000001"
}
{
_id: "000000001",
type: "user",
email: "test@email.com",
firstname: "Test",
...
}
РЕДАКТИРОВАТЬ: шаблон резервирования работает только в том случае, если два клиента, пытающихся создать учетную запись для данного электронного письма, будут надежно пытаться получить доступ к тому же документу . Если вы случайно сгенерируете новый идентификатор, то клиент A создаст и зарезервирует документ XXXX, а клиент B создаст и зарезервирует документ YYYY, и вы получите два разных документа с одинаковым адресом электронной почты.
Опять же, единственный способ выполнить транзакционную проверку «если она существует, создать, если она не существует» - это заставить все клиенты изменить один документ.