特定のデータに一致するメタデータを使用して、BLOBストレージ内のアイテムのみを戻す方法を見つけようとしています。すべてのフィールドには、「FlightNo」というキーがあります。
私が本当に望んでいるのは、メタデータとの一致を含むすべてのファイル(listBlobs)を見つける方法です。したがって、1つ上のレベルで、そのデータセットを反復処理し、各ファイルに5つのメタデータ項目があるため、さらに一致するものを見つけます。
これが私のこれまでの非常に不親切なコードです。
foreach (IListBlobItem item in container.ListBlobs(null, false))
{
if (item.GetType() == typeof(CloudBlockBlob))
{
CloudBlockBlob blob = (CloudBlockBlob)item;
blob.FetchAttributes();
foreach (var metaDataItem in blob.Metadata)
{
dictionary.Add(metaDataItem.Key, metaDataItem.Value);
}
if (dictionary.Where(r=>r.Key == "FlightNo" && r.Value == FlightNo).Any())
{
if (dictionary.Where(r => r.Key == "FlightDate" && r.Value == FlightDate).Any())
{
if (dictionary.Where(r => r.Key == "FromAirport" && r.Value == FromAirport).Any())
{
if (dictionary.Where(r => r.Key == "ToAirport" && r.Value == ToAirport).Any())
{
if (dictionary.Where(r => r.Key == "ToAirport" && r.Value == ToAirport).Any())
{
retList.Add(new BlobStorage()
{
Filename = blob.Name,
BlobType = blob.BlobType.ToString(),
LastModified = (DateTimeOffset)blob.Properties.LastModified,
ContentType = blob.Properties.ContentType,
Length = blob.Properties.Length,
uri = RemoveSecondary(blob.StorageUri.ToString()),
FlightNo = dictionary.Where(r => r.Key == "FlightNo").Select(r => r.Value).SingleOrDefault(),
Fixture = dictionary.Where(r => r.Key == "FixtureNo").Select(r => r.Value).SingleOrDefault(),
FlightDate = dictionary.Where(r => r.Key == "FlightDate").Select(r => r.Value).SingleOrDefault(),
FromAirport = dictionary.Where(r => r.Key == "FromAirport").Select(r => r.Value).SingleOrDefault(),
ToAirport = dictionary.Where(r => r.Key == "ToAirport").Select(r => r.Value).SingleOrDefault()
});
}
}
}
}
}
dictionary.Clear();
}
}
ありがとう。スコット
アイテムのメタデータについて言及した5つすべてを含むBLOBを検索することを正しく理解している場合。次のコードを使用してこれを行うことができます。私は自分の側でそれをテストします、それは正しく動作します。
var connectionString = "storage connection string";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container");
var blobs = container.ListBlobs();
var blobList = new List<CloudBlockBlob>();
foreach (var item in blobs)
{
CloudBlockBlob blob = (CloudBlockBlob)item;
blob.FetchAttributes();
if (blob.Metadata.Contains(new KeyValuePair<string, string>("FlightNo", "FlightNoValue")) &&
blob.Metadata.Contains(new KeyValuePair<string, string>("FlightDate", "FlightDateValue")) &&
blob.Metadata.Contains(new KeyValuePair<string, string>("FromAirport", "FromAirportValue")) &&
blob.Metadata.Contains(new KeyValuePair<string, string>("ToAirport", "ToAirportValue")) &&
blob.Metadata.Contains(new KeyValuePair<string, string>("FixtureNo", "FixtureNoValue")))
{
blobList.Add(blob);
}
受け入れられた答えは非常に非効率的であり、すべてのBlobとそれに関連するメタデータをループしてロードし、値をチェックすることは、妥当な量のデータではうまく機能しません。
AzureSearchを使用してBlobメタデータを検索することができます。 Blobsカスタムメタデータを含む検索インデックスを作成できます。
次の包括的な記事はそれをすべて説明しています:
AzureSearchを使用したAzureBlob Storage内のドキュメントのインデックス作成
Azure Searchを使用したBlobストレージの検索