3

我正在尝试删除早于 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))
            });

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

4

1 回答 1

6

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

        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 查询 API 会如前所示通过调用 .ToString() 为您构建它,并获得以下 Lucene 格式的查询字符串。

ExpirationDate:{00010101000000000 TO 20120601000000000}

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

        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 个结果

于 2012-05-04T17:55:59.850 回答