Это не очень хороший способ - вы теряете здесь масштабируемость.Я бы сделал это с атомным 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
получит тот же документ.