jqのmax_by関数について

jq

この記事は最終更新日から1年以上が経過しています。

tl;dr

typoには気を付けましょう。

概要

jqのmax_by関数を使用して少しはまったことがありましたのでそれについて記載します。

問題

jq-1.5にて下記のインプットに対して関数を実行するとどのようなアウトプットが得られるでしょうか?

答え


jqplayを使用して実験しました。

Why Japanese people!?!?!?!?

NULLとかエラーじゃないのかよ‼
どうやらmax_by関数は、指定したキーが存在しない場合にはJSON末尾のフィールドを取得してくるようです。
この事象に関する記載がマニュアルに見つけられないので、仕様なのかバグなのかは自分には不明です。

それでどんな感じで失敗したの?

RDSのスナップショット一覧をJSON形式で受け取り、
受け取った一覧の最新のスナップショットを取得する処理の際に max_by(.SnapshotCreateTime)と記載するところを、
max_by(.SnapshotCreateTIme)と記載してしまい正しい値が取得できずに痛い目を見ました。
具体的にはアラートとか発砲しました。深夜に。本当に申し訳ございませんでした。

ちなみに

min_by(.typo)の場合だとJSON先頭のフィールドを取得してきます。
また min_by(.)の場合はJSON末尾のフィールドを取得してきます。
逆に max_by(.)の場合はJSON先頭のフィールドを取得してきます。

不思議トリックフィールドですね。

まとめ

typoには気を付けましょう。(自戒)
関数の使い方が間違っていないとか他の処理が合っているかとか考えていると意外と気づかないものです。

この記事を書いた人

いわやす
いわやすDB周りをやっているエンジニア

DB設計やバッチ開発等を主にやってます。
たまにサーバ周りやAPI開発なんかもやってます。
主食はカップ麺です。

jq