Mongo 更新响应说没有更新文件,但文件在那里

Mongo update response says no document updated, but the document is there

我正在使用 MongoDb 2.6.10 和 C# Driver 1.9.2。服务器有两个服务器的副本集。

我的文档是这样的格式。 itemId 是唯一的。

{
    "itemID": 2314,
    "Favorites": [1, 24, 26, 34]
}

然后我有代码来删除表单的收藏夹

var query = Query.EQ("itemID", itemId);
var result = collection.Update(query, Update.Pull("Favorites", favoriteIdToRemove));

每次之后,我检查result.DocumentsAffected是否等于1。偶尔,值返回为0。当我自己进入MongoDB时,我可以找到文档匹配 itemID,我可以看到它试图在数组中删除的 favoriteId 仍然存在。 result.OK为真,无错误信息

什么会导致失败?

有可能当文档已经存在并且与之前的文档完全相同时,不需要更改,因此 DocumentsAffected 属性 将为 0。您可以在此处查看文档:https://docs.mongodb.org/manual/reference/method/WriteResult/#WriteResult。您可以在结果的 Response 属性 中看到这些属性。

我不是专家,但我的猜测是写入问题,因为在 MongoDB 中写入和更新文档有不同级别的保证。参见 Write Concerns

所以不用这个 method:

MongoCollection.Update Method (IMongoQuery, IMongoUpdate)

最好改用 method:

MongoCollection.Update Method (IMongoQuery, IMongoUpdate, WriteConcern)

并指定 WriteConcern 为

WriteConcern.WMajority

这样更新保证最高。