Mongo更新响应表示没有更新文档,但文档已存在

时间:2016-01-15 20:19:09

标签: c# mongodb mongodb-.net-driver

我正在使用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));

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

什么可能导致失败?

2 个答案:

答案 0 :(得分:1)

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

所以不要使用此method

class Nutrition
    @@list = CSV.read("./lib/list.csv")

    def self.carbs(name)
        return "error" if @list.nil?
        carb = (@@list.find { |x| x[0] == name })
        carb.nil? ? "error" : carb[1]
    end
end

最好使用此method代替:

MongoCollection.Update Method (IMongoQuery, IMongoUpdate)

并将WriteConcern指定为

MongoCollection.Update Method (IMongoQuery, IMongoUpdate, WriteConcern)

这样,更新具有最高的保证。

答案 1 :(得分:0)

当文档已经存在并且与前一个文档完全相同时,可能不需要进行任何更改,因此DocumentsAffected属性将为0.您可以在此处查看文档:{​​{3}} 。您可以在结果的Response属性中看到这些属性。