2012-05-04 8 views
3

ravenDBの特定のポイントより古い文書を削除しようとしています。私はまだLuceneに慣れておらず、このクエリを構築するのは苦労しています。ravenDBの有効期限までに文書をバッチで削除する

 _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)) 
      }); 

特定の日付より前にアイテムを削除するクエリの正しい構文は何ですか?

+0

なぜ期限切れのバンドルを使用しないのですか? –

答えて

5

あなたはDatabaseCommands IndexQuery外にクエリを作成し、以下のようにIndexQueryクエリ文字列移入しQuery.ToString()を使用することができます。この方法を使用して

 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結果を返しますので、ページネーションへ注意、。

+0

一度に30〜40,000件のアイテムを削除しています。私のシナリオでは、インデックスで削除するのが最も効率的です。私はインデックスが古くなっているのを心配していません。私はこれを数分おきに実行しています。 ありがとう!私はLuceneQuery機能にはわかっていませんでした。 –

+0

これを実行するやや良い方法は、組み込みのRavenDB関数を使用することです。https://github.com/ayende/ravendb/blob/master/Raven.Abstractions/Linq/DateTools.csを参照してください。 –

関連する問題