【问题标题】:Map reduce returns old dataMap reduce 返回旧数据
【发布时间】:2018-11-09 23:42:03
【问题描述】:

我有以下地图:

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))
}

如果我锁定索引文件夹,然后保存文档,然后删除文档并重新保存文档以触发重新索引,则旧文档仍会出现在索引查询结果中,尽管索引被报告为最新。最后索引日期也早于文档更新日期,因此索引不应包含任何旧结果。

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

我怎样才能让 reduce 过滤掉旧的结果?

【问题讨论】:

  • 其中一个答案是否有助于解决您的问题,Imran?还是您还有问题?
  • 抱歉 Judah 回复晚了,Ayende 在 youtrack 上回复了我关于这个问题的答案,答案不是解决方法,请参阅:issues.hibernatingrhinos.com/issue/RavenDB-12381

标签: mapreduce ravendb


【解决方案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

【讨论】:

  • 索引报告为最新的,因此就 RavenDB 而言,索引是最新的。我只使用几个文档在本地进行了测试,尽管索引报告为最新,但旧结果永远保留在那里。
  • 顺便说一句,我尝试了使用 WaitForNonStaleResultsAsOfLastWrite 的建议,但我仍然看到一个不应该存在的旧文档。
  • 你能建议吗?
【解决方案2】:

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

解决此问题的推荐方法是在创建/更新/删除调用期间调用 .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 之后立即运行您的查询,您将看到预期的更新结果。

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多