我试图更新文件,如果发现其他人将其插入mongodb。这些文档基于通过kafka
发布的数据,因此findandupdate
函数在收到消息时实时执行。我已经在我的收藏中设置了一个独特的索引,如下所示
db.uniqueTitles.createIndex({title:1},{unique:true})
以下是在分叉进程中执行findAndUpdate
的代码:
const {ObjectID} = require('mongodb');
var {mongoose} = require('../db/titleDb');
var {createModel} = require('../models/titleModel');
var titleModel = mongoose.model('uniqueTitles',titleSchema);
process.on('message', (msg) => {
var values = JSON.parse(msg.value);
var bookTitle = new titleModel({
title:values['book_title'],
first_seen:values['published_date'],
last_seen:values['published_date']
});
var magazineTitle = new titleModel({
title:values['magazine_title'],
first_seen:values['published_date'],
last_seen:values['published_date']
});
titleModel.findOneAndUpdate({title:values['book_title']},{last_seen:values['published_date']},{new:false,upsert:false})
.then(res=>{
if (res === null) bookTitle.save().then(res=>{})
})
.catch(err => {});
titleModel.findOneAndUpdate({title:values['magazine_title']},{last_seen:values['published_date']},{new:false,upsert:false})
.then(res=>{
if (res === null) magazineTitle.save().then(res=>{})
})
.catch(err =>{});
});
但是当我执行程序时,它会给我一个错误
ERROR 11000重复密钥
我很困惑,因为这不应该发生。这是因为async
mongoose
来电引起的潜在竞争条件吗?有什么方法可以解决这个问题吗?