我正在尝试使用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吗?
答案 0 :(得分:1)
是的,请检查this answer
我无法看到BuildQueryByKey中发生了什么。但是您确实需要找出代码发送到FindAndUpdate命令的文档。
只需打印出您的查询并更新变量即可查看正在发生的事情。
编辑:对于你的自动生成_id,只需将其从文档中删除;-)或者将其设置为null并添加[BsonIgnoreIfDefault]属性