2011-02-02 3 views
0

Un site Web que je crée permet aux utilisateurs d'avoir un sous-domaine unique sur le site, par exemple; gaz123.mywebsite.com.MongoDB intégrité des données sur une commande create avec une commande de validation précédente

Ils entrent leur sous-domaine lorsqu'ils s'inscrivent sur le site. Dans le code avant de créer l'enregistrement du compte, je vérifie que le sous-domaine qu'ils ont choisi n'existe pas déjà. Ceci est juste une simple requête sur des comptes avec le même sous-domaine. Si cela renvoie un nombre zéro alors je continue et crée le compte avec ce sous-domaine.

J'ai placé une commande lock() autour des deux commandes MongoDB c'est à dire; vérifiez que le sous-domaine est disponible, puis créez le compte. Puis je relâche la serrure.

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

Est-ce ainsi que vous le feriez? Y a-t-il un autre moyen qui soit meilleur? Pourquoi?

Merci

Répondre

3

Ce n'est pas une bonne façon - vous perdez l'évolutivité ici. Je le ferais avec atomique findAndModify. D'abord, vous aurez besoin d'établir un index unique sur le champ subdomain:

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

Ceci est nécessaire pour upsert de ne pas générer des doublons. Ensuite, vous allez faire ceci:

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

Cela soit retourner le document qui représente un sous-domaine libre ou jeter de clé doublon qui signifie que le sous-domaine est utilisé. Pour le sous-domaine libre, cela va également définir atomiquement used à true donc il est garanti qu'une seule opération findAndModify obtiendra le même document.

+0

Vous avez raison merci –

Questions connexes