当试图在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吗?
有,检查这个答案
我看不出BuildQueryByKey中发生了什么。但是你真的需要找出你的代码发送给FindAndUpdate命令的是什么文档。
打印你的查询并更新变量,看看发生了什么。
编辑:为您的自动生成_id,只需将其从您的文档中删除;-)或将其设置为null并添加[BsonIgnoreIfDefault]属性