2016-02-19 2 views
0

У меня есть пара мест в моем приложении, где используется мангуст, где мне нужно обрабатывать одновременную модификацию.Обработка одновременной модификации w/mongoose

Я знаю, что есть версия '__v' во всех моих документах. Большинство все, что я смотрю на точках обратно в этот блог:

http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning

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

posts.update({ _id: postId, __v: versionNumber } 
      , { $set: { 'comments.3.body': updatedText }}) 

Следует ли использовать мангуст __v автоматически для подтверждения документов при их сохранении? Или вы всегда должны добавить его в свой запрос?

+0

'mongoose.set ("отлаживать", правда)' ответить на ваш вопрос будет для вас. Не то, чтобы я был поклонником этого процесса. Тестирование для определенного значения '__v' означает, что у вас уже есть эта информация из документа и что вы вообще не хотите изменять контент, если это значение/версия не совпадает. Это почти никогда не бывает реалистичным, и на самом деле ваше приложение не должно заботиться об этом, или обновления должны применяться по-другому, когда требуются такие вещи, как «история». i.e Добавить в массив. Если вы создадите правильные шаблоны доступа, у вас не будет таких проблем. –

+1

Быстрый пример из вашего вышеуказанного кода. Вы должны ** никогда не писать «comments.3.body», подразумевая, что «тело» должно указывать «тело» в этой позиции индекса в массиве. Вместо этого вы должны написать '.update ({" _id ": postId," comments._id ": commentId}, {" $ set ": {" comments. $. Body ": updatedText}})'. Таким образом, вы никогда не обновляете ничего, кроме элемента, который, как вы знаете, действительно хотите, а не что-то еще, что теперь может быть в положении. Единственное, с чем поможет '__v', - это избегать двух пользователей, изменяющих один и тот же комментарий одновременно. Но было бы лучше разрешить изменения только автору. –

ответ

0

После просмотра Mongoose исходных кодов, то __v действительно используется только для arrays, то VERSION_WHERE устанавливается при updating the array path.

if ('$push' == op || '$pushAll' == op || '$addToSet' == op) { 
    self.$__.version = VERSION_INC; 
    } 
    // now handling $set, $unset 
    else if (/\.\d+\.|\.\d+$/.test(data.path)) { 
    // subpath of array 
    self.$__.version = VERSION_WHERE; 
    } 

И в this answer,

var t = Test(); 
t.name = 'hi' 
t.arr = [1, 2, 3, 4, 5, 6]; 

t.save(function (err, result) { 
    console.log(result); 
    // use Mongoose pull method on the array 
    t.arr.pull(3); 
    t.save(function(err2, result2) { 
     console.log(result2) 
    }); 
}); 

Результаты:

{ __v: 0, 
    name: 'hi', 
    _id: 53f59d2a6522edb12114b98c, 
    arr: [ 1, 2, 3, 4, 5, 6 ] } 
{ __v: 1, 
    name: 'hi', 
    _id: 53f59d2a6522edb12114b98c, 
    arr: [ 1, 2, 4, 5, 6 ] } 
Смежные вопросы