猫鼬防止基于document.count()的重复ID号

时间:2019-07-04 19:48:17

标签: mongodb mongoose

我的所有文档都有序列号,另存为字符串作为ID(用0填充)。创建新记录时,我首先请求Comment.count()。使用从中返回的数字,我生成了ID字符串。然后,我创建一个对象,并将其另存为新文档。

    var commentNumber = (result[1] + 1).toString().padStart(4, '0');

    var newComment = this({
        html: processedHtml,
        number: commentNumber
    });

    newComment.save(function(err, result) {
        if (err) return callback(err);

        return callback(null, result);

    });

问题是,如果同时提交两个评论,则它们将获得相同的ID(如果我在提交时提出2个请求而不是1个请求,则它们将具有相同的ID)。

如何防止这种情况?

1 个答案:

答案 0 :(得分:1)

一个简单的选择是在number上创建唯一索引,以使其中一个请求失败。

另一种方法是将当前的计数存储在其他位置。如果您想使用mongo,则可以在另一个集合中使用commentCount的文档,并在findAndUpdate中使用$inc,然后使用返回值。这仍然会导致一种奇怪的竞争状况,即当评论1的创建时间比评论3更长时,用户只能看到评论23

我认为在文档上存储注释号的方法从根本上是有缺陷的:它会产生奇怪的竞争条件,奇怪的错误处理以及复杂的删除操作。如果可能的话,最好计算出路的评论数。

就排序而言,mongo _ids在_id的开头编码日期时间信息,因此您可以使用_id对文档进行排序。