Я пишу программу на Node.js, используя MongoDB, и я хочу обновить базу данных при изменении определенных файлов. Внутри базы данных я храню mtime каждой записи базы данных и хочу сравнить ее с mtime файла, чтобы увидеть, устарела ли запись базы данных. Вот мой код:
function updateArticles(articles) {
const dir = "articles";
const files = fs.readdirSync(dir);
files.forEach(
(file) => {
const fpath = path.join(dir, file);
const fmtime = fs.statSync(fpath).mtimeMs;
articles.updateOne(
//refresh content and mtime if the text file has been modified
{
_id: file,
mtime: {$lte: fmtime}
},
{
$set: {content: htmlifySync(fpath), mtime: Date.now(), title: titleSync(fpath)},
//btime is only set once
$setOnInsert: {btime: Date.now()}
},
{upsert: true}
)
});
}
Когда я устанавливаю {upsert: true}
, я получаю ошибку дублирующего ключа. Когда я устанавливаю {upsert: false}
новые записи не добавляются. Это работает, если я удаляю второе условие в своем запросе, но затем он запускает htmlifySync
и titleSync
для каждой записи, которая является дорогой и ненужной.
Я думаю, что проблема в том, что mongoDB пытается вставить новая запись, которая удовлетворяет обоим условиям запроса, что означает, что она пытается вставить новую запись с тем же идентификатором. Я хочу, чтобы mtime: {$lte: fmtime}
был фильтром для обновления, но я не хочу, чтобы оно обновлялось обновлением.
Чтобы уточнить:
- Если есть БД запись для файла:
- Если файл был изменен с момента последнего обновления БД, я хочу обновить его
- Если файл не был изменен с момента последнего обновления БД, который я хочу оставить без изменений
- Если для файла нет записи в БД, я хочу создать одну