MongoDB: Убедитесь, что указанный документ все еще существует - PullRequest
0 голосов
/ 20 января 2012

Допустим, у меня есть два типа документов 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?

Ответы [ 2 ]

0 голосов
/ 20 января 2012

То, как вы, кажется, делаете это, то есть с двумя отдельными Моделями, а не с поддокументами (трудно сказать, не видя Моделей), я думаю, у вас будет такое состояние гонки.if не поможет.Чтобы избежать этой проблемы, вам нужно воспользоваться атомными модификаторами, и при использовании отдельных Моделей (каждая из которых является собственной коллекцией MongoDB), атомарные модификаторы недоступны .В мире SQL вы используете транзакцию для обеспечения согласованности.Точно так же в хранилище документов, таком как MongoDB, вы сделаете каждую задачу вложенным документом проекта, а затем просто .push() новые задачи.Но, возможно, ваш вариант использования требует отдельных, не связанных между собой моделей.MongoDB отлично подходит для предоставления такой гибкости, но позволяет сохранять мышление на SQL, не будучи SQL, что может привести к проблемам при проектировании.

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

0 голосов
/ 20 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...