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 に答える