Я проверил updateMany.
Testing1:
Update 40K документы с updateMany (тянуть), во время выполнения, выключение DB внезапно, то некоторые узлы прошли (данные вытянута), некоторые не смогли (данные не тянули в каком-то уровне 5 узлов в дереве), перезапустите db и снова запустите updateMany, все переданы и все данные верны.
Испытание 2:
Создать уникальный индекс на поле, вставить некоторые данные, в методе updateMany, некоторые документы не удалось из-за уникальным ключ нарушения.
Результаты моего теста2: обновлен нулевой документ.
function insertData() {
const dataSource = app.models.Entity.getDataSource();
return new Promise((resolve, reject) => {
dataSource.connector.connect((err, db) => {
if (err) {
reject(new Error('.... error'));
return;
}
const entityCollection = db.collection('Entity');
// Create index
entityCollection.createIndex({ age: 1 }, { unique: true })
.then(() => {
// Insert data
const data = [
{
id: uuid.v4(),
age: 1,
type: 'test',
},
{
id: uuid.v4(),
age: 2,
type: 'test',
},
{
id: uuid.v4(),
age: 3,
type: 'test',
},
{
id: uuid.v4(),
age: 4,
type: 'test',
},
{
id: uuid.v4(),
age: 5,
type: 'test',
},
{
id: uuid.v4(),
age: 6,
type: 'test',
},
];
return insertData(data);
})
.then(() => {
resolve();
})
.catch((err2) => {
reject(err2);
});
});
});
}
function updateAge() {
const dataSource = app.models.Entity.getDataSource();
return new Promise((resolve, reject) => {
dataSource.connector.connect((err, db) => {
if (err) {
reject(new Error('...error'));
return;
}
const entityCollection = db.collection('Entity');
entityCollection.updateMany(
{ age: { $gt: 0 } },
{ $mul: { age: 2 } },
).then(() => {
resolve();
})
.catch((err2) => {
logger.error(`ERROR is ${err2}`);
reject(err2);
});
});
});
}
Результат теста: Нулевой документы обновляются. "msg": "ОШИБКА - это MongoError: E11000 копия коллекции ошибок: контент-база.Индекс Entity: age_1 DUP ключ: {: 2}», "V": 1} 1) тест updateMany
0 прохождение (114ms) 1 неудачу
Спасибо за хедз-апе на атомном уровне. Основываясь на супер полезных ссылках, которые вы отправили, я думаю, что оператор $ изолированных будет предоставлять то, что мне нужно в этом случае для обновления. Подход на основе timetamp, подобный двухфазному фиксации, который вы упомянули, должен работать, чтобы гарантировать, что документы, которые я возвращаю, такие же, как те, которые были только что обновлены. –