当试图在MongoDB中Upsert记录时,重复键_id

本文关键字:id 记录 MongoDB Upsert | 更新日期: 2023-09-27 18:11:40

我正试图在c#中使用。net的MongoDB驱动程序1.9.2实现Upsert方法。

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

我的对象有一个名为id的成员。如果我的方法接收到一个没有id设置的对象,那么在MongoDB中创建一个新记录,正如预期的那样。

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

命令'findAndModify' failed: exception: insertDocument::由:: 11000 E11000重复键错误索引:XXXXXXXX.MyObjectClassName。$id dup key: {: 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之后,我发现有些人通过在对象定义的id列中添加[BsonIgnoreIfDefault]属性来解决这个问题,但它并没有为我改变任何东西。

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

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

所以现在更新工作,但插入不能。而不是自动生成_id, Mongo似乎期望我将传递下一个ID,例如:8,如果已经有7行了。然后插入成功。它不能自动生成一个自动递增的ID吗?

当试图在MongoDB中Upsert记录时,重复键_id

有,检查这个答案

我看不出BuildQueryByKey中发生了什么。但是你真的需要找出你的代码发送给FindAndUpdate命令的是什么文档。

打印你的查询并更新变量,看看发生了什么。

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