Mongodb 更新后SafeModeResult为空

Mongodb 更新后SafeModeResult为空,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,使用MongoDB和最新的10gen C#驱动程序(CSharpDriver-1.3.1.4349),我试图进行一次“就地”更新,并恢复结果中生效的文档 public static long SaveListings(string state, bool isActive, DateTime updateDate) { var result = Collection().Update( Query.And( Query.EQ("State", state),

使用MongoDB和最新的10gen C#驱动程序(CSharpDriver-1.3.1.4349),我试图进行一次“就地”更新,并恢复结果中生效的文档

public static long SaveListings(string state, bool isActive, DateTime updateDate)
{
    var result = Collection().Update(
    Query.And(
        Query.EQ("State", state), 
        Query.And(
            Query.EQ("IsActive", isActive),
            Query.LT("UpdateDate", updateDate))),
    Update.Set("IsActive", false), UpdateFlags.Multi);
    return result != null ? result.DocumentsAffected : -1;
}
由于某种原因,结果为空。如果我从控制台执行此操作,我可以通过执行此操作获得影响的行数:

db.Listing.update( { State: state.Abbreviation, IsActive: true, UpdateDate: { $lt: expiredDate } }, { $set: { IsActive: false } }, false, true);
var numRows = db.getLastErrorObj().n;

知道我做错了什么吗?或者这是C#驱动程序中的一个bug吗?

在不指定安全模式的情况下执行插入和更新会产生null,因为它们是异步操作-根本无法知道插入或更新是如何进行的

因此,如果您关心结果,请在INSERT和updates中添加例如SafeMode.True作为最后一个参数。这将使驱动程序发出
getLastError
命令,该命令将一直阻止,直到插入/更新完成:

var result = collection.Update(query, update, SafeMode.True);

您可以阅读更多关于
getLastError
和不同安全模式的信息。

更新包含采用
SafeMode
的重载方法。只需将其作为更新的第四个参数添加到代码中,并且不应为null:

...
UpdateFlags.Multi,
SafeMode.True);

这不是驱动程序错误,它按预期工作。如果在没有安全模式的情况下插入文档,Mongodb不会等待文档(因此驱动程序返回null),但如果您说SafeMode=true,则会强制Mongodb等待文档插入。

请尝试getLastError此处:

谢谢!我知道安全模式是如何工作的,但我错误地认为默认情况下连接将使用安全模式。我也有同样的问题,请注意当前驱动程序在显式使用getLastError时存在身份验证问题。Robert(10gen的开发人员)建议使用SafeMode.True,直到问题解决为止。看见