2012-01-20 2 views
0

Disons que j'ai deux types de documents MongoDB: 'Projets' et 'Tâches'. Un projet peut avoir plusieurs tâches. Dans mon cas, il est plus approprié de lier les documents plutôt que de les intégrer.MongoDB: Vérifier que le document référencé existe toujours

Lorsqu'un utilisateur veut enregistrer une tâche que je vérifie en premier lieu que le projet la tâche est assignée à existe, comme ceci:

// Create new task 
var task = new Task(data); 
// Make sure project exists 
Project.findById(task.project, function(err, project) { 
    if(project) { 
    // If project exists, save task 
    task.save(function(err){ 
     ...  
    }); 
    } else { 
    // Project not found 
    } 
}); 

Ma préoccupation est que si un autre utilisateur arrive à supprimer le projet après la Project.findById() La requête est exécutée, mais avant que la tâche soit enregistrée, la tâche sera créée de toute façon sans projet référencé.

Est-ce une préoccupation légitime? Y a-t-il une pratique qui empêcherait cela de se produire, ou est-ce juste quelque chose qui doit être confronté avec MongoDB?

Répondre

0

Techniquement oui, c'est quelque chose que vous devez faire face lors de l'utilisation de MongoDB. Mais ce n'est pas vraiment un gros problème car il est rarement quelqu'un pour supprimer un projet et une autre personne ne le sait pas et créer une tâche pour ce projet. Je n'utiliserais pas l'instruction if pour vérifier l'état du projet, plutôt que de laisser la tâche créée comme un mauvais enregistrement. Vous pouvez supprimer manuellement ces enregistrements incorrects ou planifier une tâche périodique pour les nettoyer.

+0

Fait sens. J'aime l'idée d'un travail cron. –

0

La façon dont vous semblez le faire, c'est-à-dire avec deux modèles séparés - pas des sous-documents (difficile à dire sans voir les modèles), je suppose que vous aurez cette condition de course. Le if n'aidera pas. Vous auriez besoin de tirer parti des modificateurs atomiques pour éviter ce problème, et en utilisant des modèles distincts (chacun étant sa propre collection MongoDB), le atomic modifiers are not available. Dans le monde SQL, vous utilisez une transaction pour garantir la cohérence. De même, avec un magasin de documents comme MongoDB, vous devez faire de chaque tâche un sous-document d'un projet, puis seulement .push() nouvelles tâches. Mais peut-être que votre cas d'utilisation nécessite des modèles distincts et indépendants. MongoDB est génial pour offrir cette flexibilité, mais il vous permet de conserver la pensée SQL sans être SQL, ce qui peut entraîner des problèmes de conception. Mais plus important encore, la situation raciale qui vous inquiète ne semble pas être une grosse affaire. Après tout, le projet pourrait être supprimé après la sauvegarde de la tâche. Vous avez évidemment une méthode pour nettoyer cela. Une autre fonction de nettoyage n'est pas la fin du monde - probablement une bonne chose à avoir dans votre poche arrière de toute façon.

Questions connexes