我在使用MongoDB的C#驱动程序时遇到了一些奇怪的行为。我正在尝试执行替换多个字段的更新,因此我使用了API中的ReplaceOneAsync()
方法。我与任何集合的连接是使用WriteConcern.Acknowledged
进行的,因此我可以处理因任何原因(例如在这种情况下)无法更新数据库的情况。
有时数据库不会更新记录,但我无法确定为什么。在尝试调试这种情况时,我正在查看从ReplaceOneAsync方法返回的ReplaceOneResult
对象,它显示MatchedCount = 1,但ModifiedCount = 0,如下面屏幕截图中的调试器所示:
这怎么可能?如果它匹配我正在尝试替换的一个id,为什么不执行修改?这是否意味着存在某种错误状态导致它无声地失败?它不会抛出任何异常,所以如果是这种情况,我怎样才能确定出现了什么问题?
以下是简单的更新方法:
public virtual async Task<bool> Update(T entity)
{
if (entity.Id == ObjectId.Empty)
throw new ArgumentException("Id must be available and in the database to perform an update.");
ReplaceOneResult result = await this.MongoConnectionHandler.MongoCollection.ReplaceOneAsync(e => e.Id == entity.Id, entity);
return result.ModifiedCount > 0;
}
答案 0 :(得分:1)
如果MatchedCount = 1且ModifiedCount = 0,则应该是因为您的替换文档与现有文档相同。
所以他们匹配,但不需要替换,因为它们是相同的。