model.count不是快速异步写入存在的可靠测试

时间:2013-11-14 23:36:54

标签: node.js mongodb mongoose mlab

在通过MongoLab数据库中的nodejs将新文档保存到mongodb集合之前,我正在使用model.count来检查某些字段以防止重复输入:

MyModel.count({field1: criteria1, field2: criteria2}, function (err, count) {
  if (count == 0) {
    // Create new document and call .save()
  }
});

但是,在测试期间,我注意到在进程完成后,集合中的许多重复项(测试运行中的数量不一致),尽管没有像我没有执行.count()检查那么多。

由于MyModel.count()语句嵌入在几个ReadStream之一发出'readable'事件时重复调用的回调中,我怀疑快速写入集合会导致异步问题。具体而言,对MyModel.count的两个或多个相同且几乎同时的调用会返回count 0,并最终创建并保存(相同)文档到集合中。

这听起来有可能吗?如果是这样,如何在不设置超时或使用同步模式的情况下强制执行文档写入的唯一性?

1 个答案:

答案 0 :(得分:1)

正如Peter所评论的,强制唯一性的正确方法是在这些字段上的集合上创建unique index,然后处理code: 11000插入错误以从创建重复项的尝试中恢复。

在从中创建模型之前,您可以通过模式添加索引:

mySchema.index({field1: 1, field2: 1}, {unique: true});