MongoDb c# .net Save 抛出重复键异常

Posted

技术标签:

【中文标题】MongoDb c# .net Save 抛出重复键异常【英文标题】:MongoDb c# .net Save throwing duplicate key exception 【发布时间】:2013-09-14 05:02:55 【问题描述】:

我不明白为什么我在保存时收到重复键异常。我认为保存的目的是如果有就更新,如果没有就插入。这是错误。

WriteConcern 检测到错误“E11000 重复键错误索引:cms.BaseVariables.$id dup key: : "8f69cb40ab3568957c237ef360d29964" ”。 (响应为 “err”:“E11000 重复键错误索引:cms.BaseVariables.$id dup key::\“8f69cb40ab3568957c237ef360d29964\””,“代码”:11000,“n” : 0, "connectionId" : 6969, "ok" : 1.0 )。

是的,没错,8f69cb40ab3568957c237ef360d29964 已经存在。那么为什么不只是更新呢?

我在对象上有以下类映射注册和 ID 属性...

BsonClassMap.RegisterClassMap<BaseVariableGroup>(cm =>

    cm.AutoMap();
    cm.SetIdMember(cm.GetMemberMap(c => c.Id));
    cm.IdMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);
);

public string Id

    get  return _id; 
    set
    
        _id = value;
        _id = Md5Cryptography.Hash(string.Concat(SportId, CompetitionId, Round));
    

这就是我如何调用 Save...

_collection.Save(baseVariableGroup)

例外...

【问题讨论】:

这看起来像 C# 但这是什么语言? 我已经更新了。你是对的。 我无法重现该问题。您使用的是哪个版本的驱动程序和哪个数据库版本? 其实我不确定这是否只是打开公共语言运行时异常时的正常行为...... DB版本2.2.3和驱动程序版本1.7.0.4714。 【参考方案1】:

我不认为这是保存的正常行为,而且我很确定您是通过生成 id 的方式来引出它的(我认为驱动程序认为每次都会更改 Id)。有一条更快乐的路径,我确信可以避免这个问题:创建一个 POCO 来对您的“复合 id”成员public class BaseVariableGroup public CompoundId Id get; set: 进行分组。您不再需要触摸班级地图。

【讨论】:

以上是关于MongoDb c# .net Save 抛出重复键异常的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 在使用 .save() 方法更新文档时抛出 E11000 重复键错误

用c#操作Mongodb(附demo)

无法从 MongoDB.Driver for C# 访问 MongoCollection 类

MongoDb 和 C#:嵌入式或参考文档 [重复]

MongoDb 和 C#:嵌入式或参考文档 [重复]

使用 C# 驱动程序以指定顺序从 MongoDB 获取文档 [重复]