在唯一索引上使用mongodb findandupdate时出现重复键错误

时间:2017-10-03 13:17:58

标签: javascript node.js mongodb mongoose

我试图更新文件,如果发现其他人将其插入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来电引起的潜在竞争条件吗?有什么方法可以解决这个问题吗?

0 个答案:

没有答案