为什么抛出重复键错误并且仍然插入值

本文关键字:插入 错误 为什么 | 更新日期: 2023-09-27 18:36:43

使用 c# 将文档插入到集合中

{
   "_id" : UUID("some_guid")
}

通过

db.collection.insert(new { id = a_guid });

我们通过在文档中指定 id 来依赖 guid/uuid 的唯一性,这意味着 mongo db 驱动程序不会这样做。

现在,所有这些都包含在尝试中。捕获捕获重复键异常的位置。 调用代码使用此例程进行冲突检查。也就是说,如果以前没有遇到过 guid - 插入它 - 下次尝试再次插入相同的值时,异常让我们现在有一个重复项。

我们似乎陷入了这样一种情况:写入了值,但仍抛出异常,这表明在没有异常的情况下存在冲突。

我们已经在 3 节点副本集中工作了。

它在 5 节点副本集中不起作用,声称是健康的。 写入关注点设置为 1,表示当主节点写入(但不是日志)时进行确认,就像 3 节点集一样。

我应该在哪里深入挖掘?重复的异常派生自 writeconcern 异常,这里发生了什么问题吗?mongo 驱动程序是否正确解释错误并引发正确的异常?

任何线索都会很棒!

编辑:

        var database = this.client.GetServer().GetDatabase("A_Database");
        var collection = database.GetCollection<object>("A_Collection");
        try
        {
            collection.Insert(new { Id = paymentReference.ToGuid() });
        }
        catch (MongoDuplicateKeyException)
        {
            return false;
        }
        return true;

这不是在循环中调用的。

为什么抛出重复键错误并且仍然插入值

您可以捕获异常基MongoWriteException并按类别进行筛选,示例代码:

var database = this.client.GetServer().GetDatabase("A_Database");
var collection = database.GetCollection<object>("A_Collection");
try
{
    collection.Insert(new { Id = paymentReference.ToGuid() });
}
catch (MongoWriteException ex) when(ex.WriteError.Category == ServerErrorCategory.DuplicateKey)
{
    return false;
}
return true;

Hear是代码的固定版本

    var database = this.client.GetServer().GetDatabase("A_Database");
    var collection = database.GetCollection<object>("A_Collection");
    try
    {
        collection.Insert(new { Id = paymentReference.ToGuid() });
    }
    catch (Exception)
    {
        collection.Insert(new { Id = Guid.NewGuid(); });
        return tru;
    }
    return true;