【问题标题】:RavenDB Query by New PropertyRavenDB 新属性查询
【发布时间】:2014-12-18 02:25:00
【问题描述】:

我刚刚向现有的 Foo 类添加了一个新属性(已删除):

public class Foo
{
    // Other properties here
    public bool Deleted { get; set; }  // New property
}

我在数据库中有 88 个 Foos。当我尝试通过这个新属性进行查询时,我没有得到任何文件:

session.Query<Foo>().Where(x => x.Deleted == false);

我相信这是因为数据库中的任何 Foo 文档中都不存在 Deleted 属性。为了让它工作,我必须得到所有的 Foos,然后过滤完整的列表并返回 where Deleted == false。

session.Query<Foo>();
return foos.Where(x => x.Deleted == false);

这是需要处理此类更改的方式吗?最好在查询本身中使用 Where() 过滤器,但我可以理解为什么它不起作用。

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    数据库中存储的实际文档中尚不存在删除的属性,因此无法根据该属性查询它们。

    解决这个问题的方法是首先将此属性添加到实际文档中。您可以通过加载所有文档然后保存会话来做到这一点。

    这是一个示例代码如何实现这一点:

    public void LoadAndSave<T>()
    {
        using (var session = store.OpenSession())
        {
            int skip = 0;
            const int take = 1024;
            while (true)
            {
                var builds = session.Query<T>()
                    .Skip(skip)
                    .Take(take)
                    .ToList();
                skip += builds.Count;
    
                session.SaveChanges();
    
                if (builds.Count == 0)
                    break;
            }
        }
    }
    

    【讨论】:

    • 所以我需要编写这个一次性代码并让它只执行一次。 (我只是在考虑许多安装的部署场景。)这个答案似乎证实了我的假设,即在所有文档都与新字段一起保存之前,无法查询新字段。谢谢!
    【解决方案2】:

    我想我会发布另一个简单易行的选项。

    在 Raven Studio 中,您可以在 Patch 选项卡上执行补丁。您可以修补集合,以便该属性现在存在于每个文档中。只需将属性设置为等于自身。如果该属性已经存在,则它只是设置为自身。如果该属性不存在,它将被添加为空。现有信息仍然存在;没有信息丢失。

    这是执行的代码:

    this.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds = this.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多