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

时间:2012-05-04 17:03:57

标签: 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))
            });

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

1 个答案:

答案 0 :(得分: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
        });

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

ExpirationDate:{00010101000000000 TO 20120601000000000}

请注意,使用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();

支付关注分页,因为 Ravendb默认只返回128个结果