2016-03-10 6 views
3

я две модели определяется следующим образом:Update 2 разных коллекций одновременно

var OrganizationSchema = new mongoose.Schema({ 
    users: [mongoose.Schema.Types.ObjectId] 
}); 

и

var UserSchema = new mongoose.Schema({ 
    organizations: [mongoose.Schema.types.ObjectId] 
}); 

Когда пользователь хочет присоединиться к организации, мне нужно обновить и коллекцию организации и пользователя коллекция. Я хочу знать, что является лучшим способом достичь этого? Стоит ли рассматривать случай, когда один запрос обновления терпит неудачу? В настоящее время я делаю что-то вроде этого (где организация представляет собой набор экземпляр модели организации):

User.findByIdAndUpdate(req.userSession.userId, { $push: { organizations: organization.id } }, function (err){ 
    if (err) 
    { 
     // server error 
     console.log(err); 
    } 
    else 
    { 
     organization.users.push(req.userSession.userId); 
     organization.save(function (err){ 
      if (err) 
      { 
       // server error we need to cancel 
       User.findByIdAndUpdate(req.userSession.userId, { $pull: { organizations: organization.id } }, function (err){ 
        if (err) 
        { 
         // we got a problem one collection updated and not the other one !! 
         console.log(err); 
        } 
       }); 
      } 
      else 
      { 
       // success 
      } 
     }); 
     } 
    }); 

Проблема: если мой второй метод обновления не в состоянии я в конечном итоге с одной коллекции обновляется и не другой ? Есть ли способ убедиться, что они оба обновлены?

+0

У меня почти такой же вопрос. Будем надеяться, что мы получим ответ. –

ответ

0

Хорошо, во-первых, я остался бы в стороне от этого дизайна. Я бы либо ссылался, либо вставлял пользователя в организации и наоборот, а не в оба из них одновременно, поэтому у меня не было бы таких проблем (что происходит каждый раз, когда вы дублируете данные).

У MongoDB нет поддержки одновременных обновлений или транзакций. Таким образом, вы остаетесь управлять этим кодом.

Так что да, если второе обновление не удалось, тогда, когда вы написали свой код, вам нужно откат, и если откат завершится неудачно, вам нужно повторить попытку, пока он не удастся (хотя, вероятно, и с экспоненциальным отклонением). Имейте в виду, что это может быть связано с другими запросами (другой пользователь пытается сохранить одно и то же одновременно). Чтобы справиться с этим, вы должны предоставить уникальную для каждой записи в массиве.

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