4

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

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

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

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

4

1 回答 1

7

如果您要在使用 Fiddler 查询期间观察数据库通信,或者像这样在查询中请求 RavenQueryStatistics...

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

然后你会看到如下属性:

  • 是陈旧的
  • 时间戳 - 查询结果未过时的时间
  • IndexName - 被查询的索引
  • 索引时间戳
  • IndexEtag - 与索引中更新的最后一个文档对应的文档版本
  • 其他与分页等有关的事情。

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

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

因此,对于 WaitForNonStaleResultsAsOfNow,它说好的,让我们获取 DateTime.Now,然后在 IndexTimestamp >= 该日期之前不返回结果。

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

但是,看看它是如何做到的,您会发现使用 WaitForNonStaleResultsAsOfLastWrite 可能是一个更好的主意,这会导致 Raven 客户端记录它存储的最后一个文档 E-Tag,并等待 IndexETag 被合并到指数。对于“插入数据,然后在更新的网格中显示”场景尤其如此。您无需等待所有索引完成,您只需确保您刚刚插入的一件事会出现。

于 2014-06-04T16:05:01.987 回答