在查询RavenDB时,我注意到它没有立即得到预期的结果。可能与索引有关,我不知道。
例如:
int ACount = session.Query<Patron>()
.Count();
int BCount = session.Query<Theaters>()
.Count();
int CCount = session.Query<Movies>()
.Where(x => x.Status == "Released")
.Count();
int DCount = session.Query<Promotions>()
.Count();
当我执行此操作时,ACount
和BCount
会在第一次运行时立即获取其值。但是,CCount
和DCount
在三到四次运行之后才会获得它们的值。它们在前几次运行中显示0(零)值。
为什么这会发生在底部两个而不是前两个查询?如果因为陈旧的结果(或索引),那么当我第一次运行时,如何修改我的查询以获得每次的准确结果。谢谢你的帮助。
答案 0 :(得分:14)
如果您尚未为电影查询定义索引,Raven将创建Dynamic Index。如果重复使用查询,索引将自动保留。否则Raven将丢弃它,这可以解释为什么你在前几次运行中获得0结果。
您还可以指示Raven等待索引过程,以确保您始终可以使用 WaitForNonStaleResults获得最准确的结果(即使这可能不是一个好主意,因为它会减慢查询速度) 指示:
session.Query<Movies>()
.Customize(x => x.WaitForNonStaleResults())
.Where(x => x.Status == "Released")
.Count();
答案 1 :(得分:1)
需要在每个查询中放置WaitForNonStaleResults感觉就像一个巨大的“代码味道”(就像我通常讨厌这个术语一样,这里似乎完全合适)。
到目前为止,我找到的唯一真正的解决方案是:
var store = new DocumentStore(); // do whatever
store.DatabaseCommands.DisableAllCaching();
性能受到相应的影响,但我认为,如果不是完全不准确的结果,那么较慢的性能远不是不可靠的。
答案 2 :(得分:1)
根据the official documentation(最优先的第一个),您有以下选项:
设置截止点。
WaitForNonStaleResultsAsOfLastWrite(TimeSpan.FromSeconds(10))
要么
WaitForNonStaleResultsAsOfNow()
这将确保您获得截至该时间点的最新结果(或直到最后一次写入)。如果你想牺牲结果的新鲜度来更快地接收响应,你可以盖上它(例如10秒)。
明确等待非陈旧结果
WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))
同样,指定超时是一种很好的做法。
设置查询约定以将同一规则应用于所有请求
store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite
。