我们在Azure中创建了很多虚拟机。每个虚拟机都有标签。其中一些标记的键是动态构造的。这样的键具有固定前缀和动态后缀。我们想要一种方法来过滤所有具有2个或更多给定前缀的密钥的虚拟机。
考虑以下虚拟机:
- VM1:{name:"vm-1",tags:{"bingo-1 ":1," tringo-2 ":1," key1 ":联系我们
- VM1:{name:"vm-1",tags:{"tringo-2 ":1," key2 ":联系我们
- VM1:{name:"vm-1",tags:{"bingo-1 ":1," key3 ":联系我们
预期输出:vm-1
,因为它是唯一一个同时包含两个tag-key-prefixes的VM。
尝试:我得到了这个工作,但这似乎不是最佳的,因为它调用了bag_keys函数两次。
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where resourceGroup =~ 'test-resource-group'
| where bag_keys(tags) hasprefix "bingo-"
| where bag_keys(tags) hasprefix "tringo-"
| project name
这和预期的一样工作,但代价是调用了两次bag_keys。有没有一种更习惯、更优化的方法来实现相同的功能,而不需要两次调用bag_keys?
1条答案
按热度按时间5cg8jx4n1#
我没有使用两个
where
操作符,而是首先包含mv-expand操作符来将标签连接到一个记录中,然后使用and
来检查和过滤两个前缀的标签,以优化代码。更新:
如注解中所示,您可以使用
extend
运算符。它以这种方式创建一个新列,其中包含tags对象中的所有键。参考@John Kilmister的资源图浏览器查询article,以获取更多相关的查询示例。