尝试在MongoDB中更新记录时重复键_id

用户名

我正在尝试使用适用于.NET的MongoDB驱动程序1.9.2在C#中实现Upsert方法。

这个想法是将一个对象传递给该方法。如果对象已经存在于MongoDB中,则更新所有列中的数据;如果不存在,请在MongoDB中创建一个新文档。

我的对象有一个名为的成员id如果我的方法接收到没有id集合的对象,那么将按预期在MongoDB中创建一条新记录。

但是,如果它确实有一个id,例如“ 2”,它将抛出此异常而不是更新值:

命令'findAndModify'失败:异常:insertDocument ::由:: 11000 E11000重复键错误索引引起:XXXXXXXX.MyObjectClassName。$ id dup键:{:2} ...

该方法如下所示:

public override void Save(TModel modelObject) 
{ 
    MongoServer server = ConnectMongo();
    var database = server.GetDatabase(ModelDatabaseName);

    // custom method that determines which column is the key column for this type of object, e.g. "id" or "requestID" or "taskID"
    var query = BuildQueryByKey(modelObject);

    var update = Update<TModel>.Replace(modelObject);

    MongoCollection collection = database.GetCollection<TModel>(mWriteCollectionName);

    FindAndModifyArgs args = new FindAndModifyArgs() 
    {
        Upsert = true, //update if exists, otherwise insert
        Query = query,
        Update = update,
        VersionReturned = FindAndModifyDocumentVersion.Modified
        //Fields = 
    };

    var result = collection.FindAndModify(args);
}

在研究StackOverflow之后,我发现有些人通过将[BsonIgnoreIfDefault]属性添加到对象定义的id列中来解决了该问题,但对我而言并没有任何改变。

有什么想法我做错了吗?FindAndModify是否有任何示例实现可在MongoDB中更新或插入对象?

更新:我通过手动构建查询而不是使用自定义方法来使其(部分)正常工作。因此,自定义方法将返回一个查询,该查询将查找到id=2,结果是我需要的是_id=2

因此,更新现在可以正常工作,但插入无效。Mongo似乎没有期望自动生成_id,而是期望我将传递下一个ID,例如,如果我已经有7行,则传递“ 8”。然后它成功插入。它不能自动生成自动递增的ID吗?

霍夫·迈斯特

是的,请检查此答案

我看不到BuildQueryByKey中发生了什么。但是,您确实需要找出您的代码要发送给FindAndUpdate命令的文档。

只需打印出您的查询并更新vars,看看发生了什么事。

编辑:对于自动生成的_id,只需将其从文档中删除即可;-)或将其设置为null并添加[BsonIgnoreIfDefault]属性

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

未定义变量:尝试更新 Laravel 中的记录时出现 id 错误

来自分类Dev

在 R 中尝试 spread() 时对重复键求和

来自分类Dev

在CRM 2011 C#中更新记录时避免重复

来自分类Dev

MySQL在重复键更新时从查询中添加值

来自分类Dev

尝试更新多个记录时,Rails在使用friendly_id时找不到ID为ID的记录

来自分类Dev

创建记录时重复键错误

来自分类常见问题

在MongoDB中查找重复的记录

来自分类Dev

更新记录时如何防止数据库中重复记录?

来自分类Dev

在Teradata中,当存在重复记录时,如何仅更新一条记录?

来自分类Dev

尝试更新记录时出现AngularJS错误

来自分类Dev

尝试更新记录时出现 SQLite 异常

来自分类Dev

更新 Spring boot 时重复记录

来自分类Dev

使用ID键更新IndexedDb记录的单列

来自分类Dev

使用ID键更新IndexedDb记录的单列

来自分类Dev

在重复键更新为新值时

来自分类Dev

更新对象时重复输入键

来自分类Dev

尝试在Django中创建新记录时出现外键错误

来自分类Dev

尝试使用记录集书签更新记录ID时出现“编译错误:限定词必须是集合”错误

来自分类Dev

SQL:同时删除重复记录和更新外键

来自分类Dev

尝试更新记录但在 php 中失败

来自分类Dev

在重复键更新中a = VALUES(b)与a = b

来自分类Dev

Mysql INSERT INTO ... SELECT ....在重复键更新中

来自分类Dev

尝试从EF CodeFirst更新对象时,多对多表中的重复条目

来自分类Dev

在PostgreSQL中更新引用表时如何违反重复键约束(Unique_Violation)?

来自分类Dev

进行更新时,火花Hudi Job中的记录键超过1列

来自分类Dev

当我尝试从实体框架MVC更新记录时,为什么从数据库中删除了我的记录?

来自分类Dev

用多个键在重复键更新中插入..

来自分类Dev

用多个键在重复键更新中插入..

来自分类Dev

避免在键,值结构JS中重复记录

Related 相关文章

  1. 1

    未定义变量:尝试更新 Laravel 中的记录时出现 id 错误

  2. 2

    在 R 中尝试 spread() 时对重复键求和

  3. 3

    在CRM 2011 C#中更新记录时避免重复

  4. 4

    MySQL在重复键更新时从查询中添加值

  5. 5

    尝试更新多个记录时,Rails在使用friendly_id时找不到ID为ID的记录

  6. 6

    创建记录时重复键错误

  7. 7

    在MongoDB中查找重复的记录

  8. 8

    更新记录时如何防止数据库中重复记录?

  9. 9

    在Teradata中,当存在重复记录时,如何仅更新一条记录?

  10. 10

    尝试更新记录时出现AngularJS错误

  11. 11

    尝试更新记录时出现 SQLite 异常

  12. 12

    更新 Spring boot 时重复记录

  13. 13

    使用ID键更新IndexedDb记录的单列

  14. 14

    使用ID键更新IndexedDb记录的单列

  15. 15

    在重复键更新为新值时

  16. 16

    更新对象时重复输入键

  17. 17

    尝试在Django中创建新记录时出现外键错误

  18. 18

    尝试使用记录集书签更新记录ID时出现“编译错误:限定词必须是集合”错误

  19. 19

    SQL:同时删除重复记录和更新外键

  20. 20

    尝试更新记录但在 php 中失败

  21. 21

    在重复键更新中a = VALUES(b)与a = b

  22. 22

    Mysql INSERT INTO ... SELECT ....在重复键更新中

  23. 23

    尝试从EF CodeFirst更新对象时,多对多表中的重复条目

  24. 24

    在PostgreSQL中更新引用表时如何违反重复键约束(Unique_Violation)?

  25. 25

    进行更新时,火花Hudi Job中的记录键超过1列

  26. 26

    当我尝试从实体框架MVC更新记录时,为什么从数据库中删除了我的记录?

  27. 27

    用多个键在重复键更新中插入..

  28. 28

    用多个键在重复键更新中插入..

  29. 29

    避免在键,值结构JS中重复记录

热门标签

归档