在ravenDB中按截止日期删除批处理中的文档

Thi*_*tes 3 c# ravendb

我试图删除比ravenDB中的某个点更旧的文档.我仍然不熟悉Lucene,并且很难构建这个查询.

        _Session.Advanced.DatabaseCommands.DeleteByIndex(
            typeof(AssetsByExpirationDate).Name,
            new IndexQuery()
            {
                Query = string.Format("ExpirationDate:[\"{0:MM/dd/yyyy}\" TO \"{1:MM/dd/yyyy}\"]", DateTime.MinValue, new DateTime(2012,6,1))
            });
Run Code Online (Sandbox Code Playgroud)

查询在特定日期之前删除项目的正确语法是什么?

Yoa*_*. B 5

您可以在DatabaseCommands IndexQuery之外构建查询,并使用Query.ToString()填充IndexQuery Query字符串,如下所示:

        var query = session.Advanced.LuceneQuery<Asset, AssetsByExpirationDate>()
            .WhereBetween("ExpirationDate",DateTime.MinValue,new DateTime(2012, 6, 1));

        var queryString = query.ToString();

        session.Advanced.DatabaseCommands.DeleteByIndex(typeof(AssetsByExpirationDate).Name, new IndexQuery
        {
            Query = queryString
        });
Run Code Online (Sandbox Code Playgroud)

使用这种方式,如果您不熟悉lucene查询语法,RavenDb Query API会为您构建它,如前所示,通过调用.ToString()并获得以下Lucene格式的查询字符串.

ExpirationDate:{00010101000000000 TO 20120601000000000}
Run Code Online (Sandbox Code Playgroud)

请注意,使用DatabaseCommands删除不适用于陈旧索引.所以要小心或使用标准的lucene查询来检索要删除的文档,然后执行一个简单的Session.Delete(asset) foreach文档来删除.

        var query = session.Advanced.LuceneQuery<Asset, AssetsByExpirationDate>()
            .WhereBetween("ExpirationDate",DateTime.MinValue,new DateTime(2012, 6, 1));
        var assets = query.ToList();

        foreach(var asset in assets)
        {
            session.Delete<Asset>(asset);
        }

        session.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

支付注意要分页,因为Ravendb只返回128结果默认.