ReplaceOne方法的过滤器匹配文档,不执行替换

JNY*_*ger 6 c# mongodb

我正在使用MongoDB的C#驱动程序遇到一些奇怪的行为.我正在尝试执行替换多个字段的更新,因此我正在使用ReplaceOneAsync()API中的方法.我与任何集合的连接都是这样的,WriteConcern.Acknowledged所以我可以处理因任何原因(例如在这种情况下)数据库无法更新的情况.

有时数据库不会更新记录,但我无法确定原因.在尝试调试这种情况时,我正在查看ReplaceOneResult从ReplaceOneAsync方法返回的对象,它显示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;
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*tam 2

如果 MatchedCount = 1 且 ModifiedCount = 0,则应该是因为您的替换文档与现有文档相同。

所以它们是匹配的,但不需要替换,因为它们是相同的。