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

时间:2015-09-17 14:48:31

标签: c# mongodb

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

有时数据库不会更新记录,但我无法确定为什么。在尝试调试这种情况时,我正在查看从ReplaceOneAsync方法返回的ReplaceOneResult对象,它显示MatchedCount = 1,但ModifiedCount = 0,如下面屏幕截图中的调试器所示:

Debugging Screenshot

这怎么可能?如果它匹配我正在尝试替换的一个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;
}

1 个答案:

答案 0 :(得分:1)

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

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