地图减少返回旧数据

时间:2018-11-09 23:42:04

标签: mapreduce ravendb

我有以下地图:

from doc in docs
select new {Name = doc.Name, Count = 1}

减少

from result in results
group result by new {result.Name}
into g
select new {
Name =  g.Key.Name,
Count = Enumerable.Sum(g, x => ((int) x.Count))
}

如果我在索引文件夹上放了一个锁,然后保存了一个文档,然后删除了该文档,然后重新保存该文档以触发重新索引,那么尽管已报告了最新索引,但旧文档仍会出现在索引查询结果中。最后索引日期也早于文档更新日期,因此索引不应包含任何旧结果。

有什么想法吗?这实际上是我在生产系统上发现的一个大问题的一部分。我不清楚为什么会发生这种情况,但是我已经能够通过锁定索引来重现类似的情况,所以我怀疑是有一些过程导致了锁定。这意味着索引结果​​返回的预测是旧的。

如何获取减少值以筛选出过时的结果?

2 个答案:

答案 0 :(得分:1)

如果禁用索引,则文档将被更新/删除。您将从map-reduce索引中获取过时的结果。即使没有禁用索引,也会发生这种情况。

原因是索引最终是一致的。你可以在这里读到它: https://ravendb.net/docs/article-page/3.5/Csharp/users-issues/understanding-eventual-consistency

您可以使用WaitForNonStaleResultsAsOfLastWrite: https://ravendb.net/docs/article-page/2.5/Csharp/client-api/querying/stale-indexes#setting-cut-off-point

答案 1 :(得分:0)

您所描述的是陈旧的索引:您更新/创建/删除文档并立即查询该文档,但查询返回的是陈旧的结果。

解决此问题的建议方法是在创建/更新/删除呼叫期间致电。WaitForIndexesAfterSaveChanges()

// Inform Raven you'll wait for indexes when calling .SaveChanges
session.Advanced.WaitForIndexesAfterSaveChanges(
    timeout: TimeSpan.FromSeconds(30),
    throwOnTimeout: false);

// Do your update.
session.Store(new Employee
{
    FirstName = "John",
    LastName = "Doe"
});

// This won't return until affected indexes are updated.
session.SaveChanges();

// Now you can run a query against your index, and it will return the updated data.
...

这样,.SaveChanges将一直阻塞,直到索引被更新为止。在.SaveChanges之后立即运行查询,您将看到预期的更新结果。