我的所有文档都有序列号,另存为字符串作为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)。
如何防止这种情况?
答案 0 :(得分:1)
一个简单的选择是在number
上创建唯一索引,以使其中一个请求失败。
另一种方法是将当前的计数存储在其他位置。如果您想使用mongo,则可以在另一个集合中使用commentCount
的文档,并在findAndUpdate
中使用$inc
,然后使用返回值。这仍然会导致一种奇怪的竞争状况,即当评论1
的创建时间比评论3
更长时,用户只能看到评论2
和3
。
我认为在文档上存储注释号的方法从根本上是有缺陷的:它会产生奇怪的竞争条件,奇怪的错误处理以及复杂的删除操作。如果可能的话,最好计算出路的评论数。
就排序而言,mongo _ids在_id的开头编码日期时间信息,因此您可以使用_id对文档进行排序。