0

Azure テーブル ストレージにエントリを記録するセマンティック ロギングを実装しました。ここで、Azure テーブルから古いログ エントリ (たとえば 30 日以上前) を削除したいと考えています。問題は、azure テーブルの partitionKeys と RowKeys が動的に生成されることです。このようなもの

PartitionKey         RowKey

2519569987199999999  MyProjectName_2519569788418593594_FFFFFFF8 //entry date 20 october 2015
2519573205599999999  MyProjectName_2519573006928838932_FFFFFFE1 // entry date 16 october 2015

調査したところ、PartitionKey の形式は次のとおりであることがわかりました。DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks

削除のためにテーブルからデータを取得するにはどうすればよいですか? partitionKey は動的であるため、完全なテーブル スキャンを実行する必要がありますか?

4

1 に答える 1

6

削除のためにテーブルからデータを取得するにはどうすればよいですか? partitionKey は動的であるため、完全なテーブル スキャンを実行する必要がありますか?

いいえ、テーブル全体をスキャンする必要はありません。30 日前に作成されたエンティティを確認する方法は次のとおりです。

        var today = DateTime.UtcNow.Date;
        var thirtyDaysFromToday = today.AddDays(-30);
        var pk = (DateTime.MaxValue.Ticks - thirtyDaysFromToday.Ticks).ToString();
        var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
        var tableClient = account.CreateCloudTableClient();
        var table = tableClient.GetTableReference("YourTableName");
        TableQuery query = new TableQuery().Where("PartitionKey ge '" + pk + "'").Select(new List<string>(){"PartitionKey", "RowKey"});//Since you only need PartitionKey/RowKey for entities deletion thus just fetch that only
        TableContinuationToken token = null;
        do
        {
            var queryResult = table.ExecuteQuerySegmented(query, token);
            token = queryResult.ContinuationToken;
            var entities = queryResult.Results;
            //Now you can delete those entities
        }
        while (token != null);

注: 私はコードをテストしていないので、すべてを試す前に最初に小さなデータ セットで試してください :)

于 2015-10-20T08:04:57.207 に答える