2015-02-23 42 views
2

我有以下JMESPath查詢參考父元素過濾器表達式

query="Reservations[].Instances[].{ \ 
    InstanceId: InstanceId, \ 
    RootDeviceVolumeId: BlockDeviceMappings[?DeviceName==\`/dev/sda1\`] \ 
     | [].Ebs.VolumeId | [0], \ 
    RootDeviceName: RootDeviceName \ 
}" 

aws ec2 describe-instances --query $query 

這給像這樣

+------------+------------------+----------------------+ 
| InstanceId | RootDeviceName | RootDeviceVolumeId | 
+------------+------------------+----------------------+ 
| i-12345678| /dev/sda1  | vol-abcdef12  | 
| i-98765432| /dev/sda1  | vol-ef123456  | 
| i-23456789| /dev/sda1  | vol-fedcba09  | 
| i-aabbccdd| /dev/xvda  | None    | 
+------------+------------------+----------------------+ 

輸出我想找到一種方法,從內引用RootDeviceNameBlockDeviceMappings過濾表達而不是硬編碼/dev/sda1設備名稱,因爲有時它的例子是/dev/xvda。但是,我找不到在過濾器表達式中引用父元素的方法。

另一種選擇是將RootDeviceNameInstanceId映射到所有設備的投影上,然後將其傳遞給過濾器表達式,但該語法似乎不支持在投影中包括父元素。

我錯過了什麼,或者這只是JMESPath語法的限制嗎?

回答

3

我們需要有一些機制允許你綁定範圍,這是目前不可能的。我對添加這個很感興趣。現在你必須使用替代工具。

+0

感謝澄清。有沒有關於這部分規範的變化的建議? – 2015-02-23 20:41:34

+0

是的,剛剛添加:https://github.com/jmespath/jmespath.site/pull/6 – jamesls 2015-02-25 09:52:29

0

如果您願意將自定義函數添加到使用JMESPath的Python代碼中,那麼會出現一種骯髒和醜陋的方式來實現類似的功能。它確實違反了「功能應該沒有副作用」的規則。要點如下:https://gist.github.com/martinvirtel/366235401cf7fbec503d53eb44109f25

gist中的fetchstore.py文件爲JMESPath添加了一個讀取和存儲函數。請參閱下面的測試或示例瞭解它的工作原理。以下是關於如何向使用JMESPath的Python項目添加函數的指導:https://pypi.python.org/pypi/jmespath#custom-functions

輸入:

{ "name" : "parent name", 
    "data" : [ 
     { "x" : 1, "y" : 2 }, 
     { "x" : 3, "y" : 2 } 
     ] 
    } 

JMESPath表達:

{ 
    name: store(name,'parent_name_attribute'), 
    data: data[][ fetch('parent_name_attribute'),x, y] 
} 

結果:

{ 
"name": "parent name", 
"data": [ 
      [ "parent name", 1, 2 ], 
      [ "parent name", 3, 2 ] 
     ] 
}