【问题标题】:RavenDB Query Documents with Property Removed删除属性的 RavenDB 查询文档
【发布时间】:2012-02-25 18:43:58
【问题描述】:

在 RavenDB Studio 中,我可以看到 69 个 CustomVariableGroup 文档。我的查询只返回其中的 66 个。经过一番挖掘,我看到三个 not 返回的文档具有新的类结构:删除了一个属性。由于我保存了这三个 CustomVariableGroup 文档,它们的结构与其他 66 个不同。但是,当我查询所有这些文档时,为什么我只能得到其他 66 个具有旧结构的文档?

我的 C# 代码和我在 LinqPad 中的查询都只返回 66。这是 LinqPad 查询:

Session.Query<CustomVariableGroup>().Dump();  // returns 66 docs

但是,如果我这样做,我可以获得上述查询中缺少的三个文档之一:

Session.Query<CustomVariableGroup>().Where(x => x.Name == "Derating").Dump();

如何在一次查询中返回所有 69 个文档?

** 编辑:索引信息 **

在 LinqPad 查询的 SQL 选项卡中(以及在 Raven 服务器输出中),索引如下所示:

网址:/indexes/dynamic/CustomVariableGroups?query=&start=0&pageSize=128&aggregation=None

我在 Raven Studio 中没有看到该索引,大概是因为它是动态的。

** 编辑 2:此 HACK 有效 **

如果我这样做,我会得到所有 69 个文档:

Session.Query<CustomVariableGroup>().Where(x => x.Name != string.Empty).Dump();

我的猜测是,Raven 必须使用旧索引,该索引仅获取仍包含已删除列的文档。我不知何故需要使用新的/不同的索引...

有趣的是,这不起作用;它只返回 66:

Session.Query<CustomVariableGroup>().Where(x => x.Id != string.Empty).Dump();

** 编辑 3:此 HACK 也可以使用 **

Session.Advanced.LuceneQuery<CustomVariableGroup>("Raven/DocumentsByEntityName").Where("Tag:CustomVariableGroups").Dump();

【问题讨论】:

  • 我会尝试制作你自己的地图(索引),看看你是否得到相同的结果。您可能还想将此问题发布到 RavenDB Google Group Ayende / 团队监控该组,并且很可能会快速回复。如果你找到答案把它发回这里,你会吗?我想知道你发现了什么...我对 RavenDB 还是很陌生。
  • 我确实尝试了索引,但仍然只得到了 66 个文档。如果我在这里没有很快得到答案,我会尝试 google 组。是的,我也会在这里发布任何答案。谢谢!

标签: ravendb


【解决方案1】:

必须删除具有旧属性的索引。

** 之前 ** 这不起作用(仅返回 69 个文档中的 66 个):

Session.Query<CustomVariableGroup>().Dump();

** 修复 ** 删除使用从我的 C# 类中删除的旧属性的索引:

在 Raven Studio 中,我删除了这个索引:Auto/CustomVariableGroups/ByApplicationId

** After ** 这个相同的查询现在返回所有 69 个文档:

Session.Query<CustomVariableGroup>().Dump();

现在,我不确定为什么这些查询会使用该索引。我正在查询所有 CustomVariableGroup 文档,而不是 ByApplicationId。但是,删除该索引修复了它。我相信其他人可以解释原因。

【讨论】:

  • 当您使用动态查询时,我们会选择一个匹配的索引。如果您有一个仅使用该属性的索引,则它可能已被选中,然后您将无法获得没有该属性的项目
  • 谢谢您,先生。您的评论证实这是正确的答案。
  • 我们应该如何发现索引失效了?
【解决方案2】:

索引是什么样的?您是手动创建索引还是动态创建的?只是想知道这是否是基于您上面的 cmets 的问题的原因,即对象的结构发生了变化。

--S

【讨论】:

  • 在问题中查看我的**编辑**。
【解决方案3】:

它可能是一个陈旧的索引.. 如果它没有返回您期望的所有结果。

你可以使用

.Customize(x=>x.WaitForNonStaleResultsAsOfLastWrite())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多