防止重复的文件插入

时间:2017-10-30 14:49:45

标签: javascript node.js mongodb meteor duplicates

我正在构建一个Web钩子,它将从Facebook接收POST请求。在每个请求中,都有一个facebookId字段,用于在数据库中插入新记录。 facebookId在数据库中应该是唯一的(意思是没有两个记录应该具有相同的 facebookId)。 原型代码是这样的

postRequestHandler(req) {
  const facebookId = req.body.facebookId;
  if (!Meteor.users.findOne({ facebookId })) {
    Meteor.users.insert({ 
      facebookId,
      // some other fields
    })
  }    
}

问题是,有时候有很多请求(是的,它们有不同的含义),包含相同的新 facebookId(数据库中不存在)和它们几乎同时出现。这将使!Meteor.users.findOne({ facebookId })检查失败,并且具有相同facebookId字段的多个记录将插入到数据库中。我该如何防止这种情况?

1 个答案:

答案 0 :(得分:2)

您应该在facebookId字段上创建unique index,以使MongoDB保证数据的唯一性,然后在您的insert调用返回的回调周围添加一些异常处理代码(文档here)。您需要根据业务需求判断正确的异常处理代码应该是什么样的。

Meteor.users.insert({ 
    facebookId,
    // some other fields
}, function(error, id) { 
    if ( error ) {
        /* add exception handling code here, e.g. return an error message to the client */
    } else {
        /* add code for successful case here, 'id' will be your newly inserted document's '_id' */
    }
});