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

Why is a duplicate key error being thrown and value still inserted

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

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

通过

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

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

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

我们似乎遇到了这样一种情况,即写入了值但仍会抛出异常,这表明没有冲突的地方存在冲突。

我们已经在一个 3 节点的副本集中进行了这项工作。

它在 5 节点副本集中不工作,声称是健康的。 write concern 设置为 1,表示写入 master(但不是日志)时的确认,就像 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;

这不是在循环中调用的。

听说你的代码有一个固定版本

    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;

您可以捕获异常基数 MongoWriteException 并按类别使用 when 进行过滤,示例代码:

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;