通过 JavaScript 或 TypeScript 使用 Blob 索引标记来管理和查找数据
本文介绍如何使用 Blob 索引标记通过适用于 JavaScript 的 Azure 存储客户端库来管理和查找数据。
先决条件
- 本文中的示例假设你已经设置了一个项目来使用适用于 JavaScript 的 Azure Blob 存储客户端库。 若要了解如何设置项目(包括安装包、导入模块,以及创建授权客户端对象来使用数据资源),请参阅开始使用 Azure Blob 存储和 JavaScript。
- 授权机制必须具有使用 blob 索引标记的权限。 若要了解详细信息,请参阅以下 REST API 操作的授权指南:
关于 blob 索引标记
Blob 索引标记使用键值标记属性对存储帐户中的数据进行分类。 这些标记会自动索引,并作为可搜索的多维索引公开,便于你轻松查找数据。 本文介绍了如何使用 blob 索引标记来设置、获取和查找数据。
启用了分层命名空间的存储帐户不支持 Blob 索引标记。 若要详细了解 Blob 索引标记功能以及已知问题和限制,请参阅通过 Blob 索引标记管理和查找 Azure Blob 数据。
设置标记
如果代码通过以下一种机制授权访问 Blob 数据,则可以设置索引标记:
- 使用 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write 操作分配 Azure RBAC 角色的安全主体。 存储 blob 数据所有者是包含此操作的内置角色。
- 具有访问 Blob 标记的权限(
t
权限)的共享访问签名 (SAS) - 帐户密钥
有关详细信息,请参阅设置 Blob 索引标记。
可以使用以下方法设置标记:
此方法中的指定标记会替换现有标记。 如果必须保留旧值,则必须下载这些值并将其包含在对此方法的调用中。 以下示例介绍如何设置标记:
async function setBlobTags(containerClient, blobName) {
const blockBlobClient = await containerClient.getBlockBlobClient(blobName);
const tags = {
'Sealed': 'false',
'Content': 'image',
'Date': '2022-07-18',
}
// Set tags
await blockBlobClient.setTags(tags);
}
可以通过将空 JSON 对象传递到 setTags
方法来删除所有标记。
获取标记
如果代码通过以下一种机制授权访问 Blob 数据,则可以获取索引标记:
- 使用 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/read 操作分配 Azure RBAC 角色的安全主体。 存储 blob 数据所有者是包含此操作的内置角色。
- 具有访问 Blob 标记的权限(
t
权限)的共享访问签名 (SAS) - 帐户密钥
有关详细信息,请参阅获取和列出 Blob 索引标记。
可以使用以下方法获取标记:
以下示例演示如何检索和循环访问 Blob 的标记。
async function getBlobTags(containerClient, blobName) {
const blockBlobClient = await containerClient.getBlockBlobClient(blobName);
// Get tags
const result = await blockBlobClient.getTags();
for (const tag in result.tags) {
console.log(`TAG: ${tag}: ${result.tags[tag]}`);
}
}
通过 Blob 索引标记筛选和查找数据
如果代码通过以下一种机制授权访问 Blob 数据,则可以使用索引标记来查找和筛选数据:
- 使用 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/filter/action 操作分配 Azure RBAC 角色的安全主体。 存储 blob 数据所有者是包含此操作的内置角色。
- 具有按照标记筛选 Blob 的权限(
f
权限)的共享访问签名 (SAS) - 帐户密钥
有关详细信息,请参阅使用 Blob 索引标记查找数据。
注意
不能使用索引标记来检索以前的版本。 以前版本的标记不会传递给 blob 索引引擎。 有关详细信息,请参阅条件和已知问题。
使用以字符串形式发送的 JSON 对象查询数据。 这些属性不需要其他字符串引号,但值确实需要其他字符串引号。
下表展示了一些查询字符串:
标记的查询字符串 (tagOdataQuery) | 说明 |
---|---|
id='1' AND project='billing' |
基于这两个属性筛选所有容器的 Blob |
owner='PhillyProject' AND createdOn >= '2021-12' AND createdOn <= '2022-06' |
基于 owner 的严格属性值和 createdOn 属性的日期范围在所有容器中筛选 blob。 |
@container = 'my-container' AND createdBy = 'Jill' |
按容器和特定属性进行筛选。 在此查询中,createdBy 是文本匹配项,不指示通过 Active Directory 进行授权匹配。 |
你可以使用以下方法查找数据:
以下示例查找与 tagOdataQuery
参数匹配的所有 blob。
async function findBlobsByQuery(blobServiceClient, tagOdataQuery) {
// page size
const maxPageSize = 10;
let i = 1;
let marker;
const listOptions = {
includeMetadata: true,
includeSnapshots: false,
includeTags: true,
includeVersions: false
};
let iterator = blobServiceClient.findBlobsByTags(tagOdataQuery, listOptions).byPage({ maxPageSize });
let response = (await iterator.next()).value;
// Prints blob names
if (response.blobs) {
for (const blob of response.blobs) {
console.log(`Blob ${i++}: ${blob.name} - ${JSON.stringify(blob.tags)}`);
}
}
// Gets next marker
marker = response.continuationToken;
// no more blobs
if (!marker) return;
// Passing next marker as continuationToken
iterator = blobServiceClient
.findBlobsByTags(tagOdataQuery, listOptions)
.byPage({ continuationToken: marker, maxPageSize });
response = (await iterator.next()).value;
// Prints blob names
if (response.blobs) {
for (const blob of response.blobs) {
console.log(`Blob ${i++}: ${blob.name} - ${JSON.stringify(blob.tags)}`);
}
}
}
此函数的示例输出基于上一函数中的 console.log 代码显示匹配的 blob 及其标记:
响应 |
---|
Blob 1: set-tags-1650565920363-query-by-tag-blob-a-1.txt - {"createdOn":"2022-01","owner":"PhillyProject","project":"set-tags-1650565920363"} |
资源
若要详细了解如何使用索引标记通过适用于 JavaScript 的 Azure Blob 存储客户端库来管理和查找数据,请参阅以下资源。
代码示例
- 查看本文中的 JavaScript 和 TypeScript 代码示例 (GitHub)
REST API 操作
Azure SDK for JavaScript 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 JavaScript 范例与 REST API 操作进行交互。 用于管理和使用 Blob 索引标记的客户端库方法使用以下 REST API 操作:
- 获取 Blob 标记 (REST API)
- 设置 Blob 标记 (REST API)
- 按标记查找 Blob (REST API)