在RavenDB中WaitForNonStaleResultsAsOfNow的作用域是什么?

本文关键字:作用域 是什么 WaitForNonStaleResultsAsOfNow RavenDB | 更新日期: 2023-09-27 18:06:47

如果我在现有的RavenDB会话上运行以下查询:

var result = session.Query<Location>()
               .Customize(x => x.WaitForNonStaleResultsAsOfNow())
               .Where(l => l.Name = "Home" && !l.Deleted);

RavenDB等待哪些索引?我的假设是,它等待所有索引在查询时都是最新的;但是,这是否意味着如果在Location上只有一个动态索引,而在其他表上有20个索引,我们总是等待21个索引更新?

或者,我是否误解了方法的功能?

在RavenDB中WaitForNonStaleResultsAsOfNow的作用域是什么?

如果您要在Fiddler查询期间查看数据库通信,或者像这样在查询中请求RavenQueryStatistics…

RavenQueryStatistics stats;
var result = session.Query<Location>()
               .Customize(x => x.WaitForNonStaleResultsAsOfNow())
               .Statistics(out stats)
               .Where(l => l.Name = "Home" && !l.Deleted);

然后你会看到这样的属性:

  • IsStale
  • 时间戳-查询结果未过期的时间
  • IndexName—正在查询的索引
  • IndexTimestamp
  • IndexEtag -索引
  • 中最后更新的文档对应的文档版本
  • 与分页等相关的其他事项

这是WaitFor(几个变量)用来确定是否应该满足的信息。

所以,TL;DR的答案是:只查询一个索引。检查所有索引是很浪费的。

对于WaitForNonStaleResultsAsOfNow,它说,抓取日期时间。现在,然后不返回结果,直到IndexTimestamp>=该日期。

这些WaitFor方法在某种程度上是一种反模式——你不应该完全依赖它们来获得一致的结果,你可能应该(在某些情况下,但不是全部)重新设计你的UI或你的数据模型,以便你在需要一致性的地方使用按文档id加载/存储(ACID是有保证的)。

但是,看看它是如何做到的,您可以看到使用WaitForNonStaleResultsAsOfLastWrite可能是一个更好的主意,它使Raven客户端注意到它存储的最后一个文档E-Tag,并等待该IndexETag被合并到索引中。对于"插入数据,然后在更新的网格中显示"的场景尤其如此。您不需要等待所有的索引完成,您只需要确保您刚刚插入的内容将出现