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

时间:2016-10-06 03:59:45

标签: c# .net mongodb mongodb-query mongodb-.net-driver

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

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

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

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

  

命令' findAndModify'失败:异常: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,例如&#34; 8&#34;如果我已经有7行了。然后它成功插入。它不能自动生成自动递增的ID吗?

1 个答案:

答案 0 :(得分:1)

是的,请检查this answer

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

只需打印出您的查询并更新变量即可查看正在发生的事情。

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