2016-04-19 3 views
1

У меня есть 2 модели здесь user и blog. Поэтому, когда пользователь пишет блог, мой маршрутизатор вызывает их так.Как использовать мангуста для сохранения нескольких документов?

Promise.all([ 
        node.save(), 
        user.save() 
       ]).then(function (values) {      
        //do something 
       }).catch(function (err) { 
        //print error 
       }) 

Как вы можете заметить сразу же, нет никакой гарантии save(). Любой из них может потерпеть неудачу и откат для остальных. Как я могу убедиться, что оба они сохранены или отменены? Некоторые люди предлагают положить blogs в коллекцию внутри users, поэтому все в одном документе, но это сложно сделать в рейтинге блога, не так ли? Я также не уверен, действительно ли это хорошая практика, которая объединяет все вещи в MongoDB. если документы большие, это вызовет проблемы с производительностью (например, запросы/секунды)?

Спасибо.

+0

Вопрос: * «Почему вы используете' .save() '?" *. Это «своего рода» возвращает обещание, но оно действительно срабатывает заранее. Таким образом, выход будет объединен в 'Promise.all()', но фактическая последовательность будет выполняться на '.save()'. Если они являются «новыми», тогда вы можете использовать '.create()' вместо этого, что отлично подходит к обещанию. Если они являются «обновлениями», вы, вероятно, должны использовать '.findOneAndUpdate()' в любом случае. –

+0

Привет, я хочу, чтобы «узел» и «пользователь» были сохранены правильно. Обещание может сказать мне, есть ли какая-либо ошибка, поэтому я могу вернуть соответствующий http-код клиентам. Тогда я нахожу, даже если знаю, что есть ошибка, я не могу откатить эти сохраненные данные. Я новичок в MongoDB и понятия не имею, почему он был спроектирован таким образом: o – zhuchun

ответ

2

Вы не можете использовать Promise.all, вам нужно будет объединить свои обещания индивидуально.

node.save().then(user.save).then(function(){//do something else}); 

Вы также должны работать немного сложнее, чтобы получить все объекты в массиве, как вы получите с Promise.all. Но вам это действительно нужно? У вас уже есть доступ к пользователю и узлам.

Классический способ сделать это будет использовать асинхра и серию:

async.series({ 

    node: node.save, 
    user:user.save 
}, function(err, res){ 
     // res is now equal to: {node:node, user:user} 
    }); 

Большинство людей просто не заморачиваться с двухфазным совершаетом с помощью Монго. Если вам это действительно нужно, возможно, вы используете неправильный инструмент.

Если узел сохранить не удается, пользователь не будут сохранены. Если вы не можете сохранить узел без сохранения пользователя, отмените порядок операций. Если оба ДОЛЖНЫ быть обновлены для того, чтобы быть, я бы, вероятно, переосмыслил свою модель данных.

Если вам действительно нужна двухфазная фиксация, вам необходимо заново изобрести это конкретное колесо. Есть рецепт для этого в documentation. Или вы можете попробовать один из плагинов mongoose, которые претендуют на это.

+0

Цените! Теперь я знаю, что именно происходит здесь: D – zhuchun

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