Целостность данных MongoDB для команды создания с предшествующей командой проверки - PullRequest
0 голосов
/ 02 февраля 2011

Сайт, который я создаю, позволяет пользователям иметь уникальный поддомен на сайте, например; gaz123.mywebsite.com.

Они вводят свой поддомен при регистрации на сайте. В коде перед созданием учетной записи я проверяю, что выбранный ими поддомен еще не существует. Это простой запрос к аккаунтам с одним и тем же поддоменом. Если это возвращает нулевой счет, тогда я продолжаю и создаю учетную запись с этим поддоменом.

Я поместил команду lock () вокруг двух команд MongoDB, т.е. убедитесь, что поддомен доступен, а затем создайте учетную запись. Затем я снимаю блокировку.

lock( m_oLockMe)
{
    if( SubdomainIsFree( oRegisterModel.SubDomain))
    {
        CreateAccount( oRegisterModel);
    }
}

Это как ты это сделаешь? Есть ли другой способ, который лучше? Почему?

Спасибо

1 Ответ

3 голосов
/ 03 февраля 2011

Это не очень хороший способ - вы теряете здесь масштабируемость.Я бы сделал это с атомным findAndModify.Сначала вам нужно установить уникальный индекс в поле subdomain:

db.subdomains.ensureIndex({subdomain: 1}, {unique: true})

Это необходимо для того, чтобы upsert не генерировал дубликаты.Затем вы сделаете это:

r = db.subdomains.findAndModify({query: {used: false, subdomain: <subdomain>}, update: {$set: {used: true}}, new: true, upsert: true})

Это будет либо возвращать документ, который представляет свободный поддомен, либо выдает ошибку дублирующего ключа, что означает, что поддомен используется.Для свободного субдомена это также будет атомарно устанавливать used в true, поэтому гарантируется, что только одна операция findAndModify получит тот же документ.

...