Mongodb 更新后SafeModeResult为空
使用MongoDB和最新的10gen C#驱动程序(CSharpDriver-1.3.1.4349),我试图进行一次“就地”更新,并恢复结果中生效的文档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),
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,直到问题解决为止。看见