2012-01-20 4 views
0

Допустим, у меня есть два типа документов MongoDB: «Проекты» и «Задачи». У проекта может быть много задач. В моем случае более целесообразно связывать документы, а не внедрять их.MongoDB: Убедитесь, что ссылочный документ все еще существует

Когда пользователь хочет сохранить задачу я первый убедиться, что проект задачи быть назначен существует, например, так:

// 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 
    } 
}); 

Меня беспокоит то, что если другой пользователь происходит удаление проекта по истечению Project.findById() выполняется запрос, но перед тем как задача будет сохранена, задача будет создана в любом случае без ссылки на проект.

Является ли это актуальной проблемой? Существует ли какая-либо практика, которая предотвратила бы это, или это просто то, что должно быть связано с MongoDB?

ответ

0

Технически да, это то, с чем вам нужно столкнуться при использовании MongoDB. Но это не очень важно, так как редко кто-то удаляет проект, а другой человек не знает об этом и создает задачу для этого проекта. Я бы не использовал оператор if, чтобы проверить статус проекта, а просто оставить задачу, созданную как плохую запись. Вы можете вручную удалить эти плохие записи или запланировать задачу cron для их очистки.

+0

Имеет смысл. Мне нравится идея работы cron. –

0

Как вы это делаете, т. Е. С двумя отдельными моделями - без поддокументов (трудно сказать, не видя Модели), я думаю, у вас будет это состояние гонки. if не поможет. Чтобы избежать этой проблемы, вам нужно использовать атомные модификаторы и использовать отдельные модели (каждая из которых является собственной коллекцией MongoDB), atomic modifiers are not available. В мире SQL вы должны использовать транзакцию для обеспечения согласованности. Аналогично, с хранилищем документов, таким как MongoDB, вы должны сделать каждую задачу субдокументом проекта, а затем просто .push() новых задач. Но, возможно, ваш случай использования требует отдельных, несвязанных моделей. MongoDB отлично подходит для предоставления этой гибкости, но он позволяет сохранять SQL-мышление без SQL, что может привести к проблемам проектирования.

Более того, состояние гонки, о котором вы беспокоитесь, похоже, не имеет большого значения. В конце концов, проект может быть удален после сохранения задачи. У вас, очевидно, есть способ очистки. Еще одна функция очистки - это не конец света - возможно, хорошая вещь в вашем заднем кармане.

 Смежные вопросы

  • Нет связанных вопросов^_^