我正在尝试使用适用于.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] 删除。
我来说两句