我正在尝试根据我的过滤器检索 blob,因为我在 iot-hub 中创建了一个设备,该设备正在接收遥测数据并将其作为 blob 路由到存储帐户。现在我想使用 Nodejs 检索 blob。
有没有可能我可以编写一个 API 来根据过滤器过滤掉我的 blob 而无需遍历整个 blob 容器?
我正在尝试根据我的过滤器检索 blob,因为我在 iot-hub 中创建了一个设备,该设备正在接收遥测数据并将其作为 blob 路由到存储帐户。现在我想使用 Nodejs 检索 blob。
有没有可能我可以编写一个 API 来根据过滤器过滤掉我的 blob 而无需遍历整个 blob 容器?
默认情况下,Azure 存储路由{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}
在所选容器内创建具有约定的 blob 。因此,您有一个可预测的 blob 前缀,可以在查询过滤器中使用(稍后会详细介绍)。这里要注意的一件事是摄取分区{partition}
消息的零索引分区 id 。例如,如果您在创建 IoT 中心实例时选择了 4 个分区(默认),则分区 ID 将为 0、1、2 和 3。
现在进入过滤器部分的查询。通常,您很可能希望根据时间范围列出 blob(并进一步阅读内容),因为这在您的冷路径分析中非常实用。不幸的是,您将无法按设备 ID 过滤 blob,因为同一个 blob 可能包含来自多个设备的消息。因此,假设您的冷路径分析将处理具有滑动时间范围的批处理(很可能是一些连续的工作),下面是使用@azure/storage-blob
包(v12 JavaScript )的示例查询(当然过度简化,请仔细阅读内联注释)开发工具包)。您应该检查API 参考以了解即兴创作的需要。
const blobServiceClient = BlobServiceClient.fromConnectionString('myStorageConnectionString');
const containerClient = blobServiceClient.getContainerClient('myContainer');
// Add logic here to select time range.
// For simplicity I am selecting a hardcoded time range of 2020-1-1 5:45 pm to 2020-1-1 5:46 pm
// (just 1 minute range)
// assuming IoT hub has 4 partitions
for (partition = 0; partition < 4; partition++) {
// note below the prefix is picking up all blobs written at 17:45:00 to 17:45:59.xxx
let iter = containerClient.listBlobsByHierarchy("/", { prefix: `myIotHub/${partition}/2020/01/01/17/45` });
let entity = await iter.next();
while (!entity.done) {
let item = entity.value;
if (item.kind === "prefix") {
console.log(`\tBlobPrefix: ${item.name}`);
} else {
// At this point you might want to to read the blob content here. For simplicity I am just printing few blob properties below
console.log(`\tBlobItem: name - ${item.name}, last modified - ${item.properties.lastModified}`);
}
entity = await iter.next();
}
}