GROQを使用してターミナルのJSONドキュメントをクエリします
JSON文書は今日どこにでもありますが、あなたが望むように構造化されることはめったにありません。多くの場合、データが多すぎるか、奇妙に名前が付けられたフィールド、または不要なネストされたオブジェクトにデータを配置しました。グラフリレーショナルオブジェクトクエリ(GROQ)は、JSONドキュメントで直接動作するように設計されたクエリ言語(SQLなど)です。基本的に、クエリをすばやくフィルタリングし、JSONドキュメントを再フォーマットして、最も便利な形状にすることができます。
GROQはSanity.io(プライマリクエリ言語として使用されている)によって開発されました。これはオープンソースであり、JavaScriptとJSONソースのコマンドラインで使用する組み込みの方法を提供します。一緒に、GROQをターミナルツールキットに追加します。これにより、Pojectに関するJSONデータを絞る必要がある場合はいつでも時間を節約できます。
GROQをインストールしましょう
ほとんどの点と同様に、GROQ CLIツールをインストールする必要があり、端末にNPM(または糸)を使用してそれを行うことができます。
$ npmインストール-G GROQ -CLI
それを使用するには、JSONファイルを使用できる必要があります。 Curlを使用して、TODOデータのサンプルデータセットをダウンロードします。
$ curl -o todos.json https://jsonplaceholder.typicode.com/todos
データのサンプル項目を簡単に見てみましょう。
{ 「userid」:1、 「id」:1、 「タイトル」:「Delectus aut autem」、 「完了」:偽 }、
かなり簡単です。ユーザーID、TODOアイテムID、TODOタイトル、およびTODOアイテムが完了したかどうかを指定するブール値があります。
次に、基本的なGROQクエリを実行しましょう。完成したすべてのTODOを見つけますが、TODOタイトルとユーザーIDのみを返します。このラインをコピー/貼り付けても構いません。
$ cat todos.json | GROQ '*[完了== true] {title、userid}' - pretty
GROQコマンドラインツールは、標準入力に関するJSONドキュメントを受け入れます。これは、「1つのことをしてテキストストリームに取り組む」というUnix哲学と非常にうまく機能します。ファイルからJSONを読むために、CATコマンドを使用します。また、GROQはデフォルトで単一の行に最小限のJSONを出力することに注意してください。
結果を保存するには、>:を使用して新しいファイルにパイプできます。
$ cat todos.json | GROQ '*[完了== true] {title、userId}'> result.json
クエリ自体は3つの部分で構成されています。
- *データセット(つまり、JSONファイルのデータ)を参照します。
- [完了== true]は、不完全としてマークされたアイテムを削除するフィルターです。
- {title、userId}は、クエリが「タイトル」と「userId」プロパティのみを返すとするプロジェクションです。
いくつかのエクササイズでウォームアップしましょう
この投稿を通過するために運動する必要があるとは思わなかったでしょう!さて、良いニュースは、詳細を説明する前にGroqで試してみるためにいくつかのことで心を運動していることです。
- [完了== true]および/または{title、userId}を削除するとどうなりますか?
- 2のIDを持つユーザーがすべてのTODOを見つけるためにクエリを変更するにはどうすればよいですか?
- 2のIDを持つユーザーが未完成のTodosを見つけるためにクエリを変更するにはどうすればよいですか?
- 元のクエリ例のフィルターがプロジェクションと場所を交換するとどうなりますか?
- JSONをダウンロードしてGROQで処理する単一のコマンド(パイプ付き)をどのように書き込みますか?
投稿の最後に答えを入れて、参照するようにします。
ノーベル賞受賞者の照会
TODOデータはウォームアップに最適ですが、正直に言ってください。ラテン語をプレースホルダーコンテンツとして使用するリストを見るのはそれほど動機付けられていません。ただし、ノーベル賞には、公開されている過去のすべての受賞者のデータセットがあります。
これがサンプルの返品です:
{ 「受賞者」:[ { "id": "1"、 「FirstName」:「Wilhelm Conrad」、 「姓」:「Röntgen」、 「生まれ」:「1845-03-27」、 「死んだ」:「1923-02-10」、 「Borncountry」:「プロイセン(現在のドイツ)」、 「BornCountryCode」:「de」、 「Borncity」:「Lennep(Now Remscheid)」、 「DiedCountry」:「ドイツ」、 「DiedCountryCode」:「de」、 「死んだ」:「ミュンヘン」、 「性別」:「男性」、 「賞品」:[...]、 }、 // ... ] }
ああ!これはもっと面白いです!データセットをダウンロードして、すべてのノルウェーの受賞者の名を見つけましょう。ここでは、データをファイルに保存するために、Curlのoutputフラグを使用します。
$ curl -output laureate.json http://api.nobelprize.org/v1/laureate.json $ cat laureate.json | groq '*.laureates [BorncountryCode == "no"] {firstName}' - pretty
何が戻ってきますか?ノルウェーのノーベル賞受賞者12人を受け取りました。悪くない!
このクエリは、最初に書いたクエリとはまったく異なることに注意してください。これには追加の.laureatesがあります。 TODOデータセットで *を使用すると、TODOデータセットのトップレベルの配列に含まれるJSONドキュメント全体を表します。一方、受賞者ファイルは、受賞者のリストが「受賞者」プロパティに保管されているトップレベルのオブジェクトを使用します。
特定のアイテムにアクセスするには、フィルター[0]を使用して、最初の名前のみを返すことができます。それは、最初のノルウェー人がノーベル賞を受賞するのは誰だったかを私たちに伝えるべきです。
$ cat laureate.json | groq '*.laureates [BorncountryCode == "no"] {firstName} [0]' - pretty //返されたオブジェクト { 「FirstName」:「Ivar」 }
その他のエクササイズ!
クエリがどのように機能するかを確認するために、この新しいデータセットを少し遊んではいけないことを忘れがちです。
- あなたの国からのすべてのノーベル賞受賞者を見つけるために質問を書いてください。
- 最後のノルウェーの賞賛者を返すためにクエリを書いてください。ヒント:-1は最後のアイテムを指します。
- ルートオブジェクトで直接フィルタリングしようとするとどうなりますか? *[BORNCOUNTRYCODE == "NO"]?
- *.laureates \ [borncountryCode == "no" \] [0]と *.laureates \ [0 \] [BornCountryCode == "no"]の違いは何ですか?
前回と同様に、回答はこの投稿の最後にあります。
フィルターを使用します
今、私たちは合計で12人のノルウェーのノーベル賞受賞者がいたことがわかっていますが、1950年以降に生まれた人は何人いましたか?それはGroqで把握するのに問題はありません:
$ cat laureate.json | groq '*.laureates [borncountrycode == "no" && born> = "1950-01-01"] {firstName}' - pretty //サンプル返品 [ { 「FirstName」:「May-Britt」 }、 { 「FirstName」:「Edvard I.」 } ]
実際、GROQには、フィルター内で使用できる豊富なオペレーターセットがあります。数字と文字列を等しい(==)、等しい(!=)、(>)より大きく、等しい(> =)、(
さらに多くのエクササイズ!
ドリルを知っています。フィルターで少し遊んで、データセットでどのように動作するかを確認してください。もちろん、答えは最後です。
- 生きている受賞者を返すクエリを書いてください。
- フィルター[BornCountryCode == "NO"] [Born> = "1950-01-01"]と[BornCountryCode == "NO" && Born> = "1950-01-01"]に違いはありますか?
- 1973年に賞を受賞したすべての受賞者を見つけることができますか?
プロジェクションの操作
ノーベル賞のデータセットは、各受賞者の名と姓を分離しますが、それらを1つのフィールドに結合したい場合はどうでしょうか? GROQでの予測はまさにそれを行うことができます!
*.laureates [BornCountryCode == "no" && born> = "1950-01-01"] { 「名前」:FirstName "" surname、 生まれる、 「Prizecount」:count(賞)、 }
このクエリを実行すると、May-Britt MoserとEdvard Moserが1つの賞を受け取ったことがわかります(実際、同じ賞でした)。
[ { 「名前」:「メイ・ブリット・モーザー」、 「生まれ」:「1963-01-04」、 「Prizecount」:1 }、 { 「名前」:「エドバードI.モーザー」、 「生まれ」:「1962-04-27」、 「Prizecount」:1 } ]
ここで何が起こったのですか?まあ、GROQに投影を書くとき、私たちが本当に書いているのはJSONオブジェクトです。以前は、単純な投影({firstName}など)がありましたが、これは{"FirstName":FirstName}を書くショートカットの方法です。拡張されたオブジェクトの構文を使用することにより、キーの名前を変更して値を変換できます。
GROQには、文字列の連結、算術演算子(、 *、 /、%、**)、カウントアレイ(count(count(賞)))、丸め数(丸(num、)など、データを変換するための豊富な演算子と機能があります。
演習
うまくいけば、あなたはこの時点で物事に対して良い感覚を得ていますが、ここにここに予測の練習を練習するいくつかの方法があります。
- 2つ以上の賞を獲得したすべての受賞者を見つけてください。
- 女性が賞金を獲得した賞品の数を見つけてください。
- 結果のLastNameとFirstNameを組み合わせたFullNameキーをフォーマットします。
一度にもっとやっています
これを見る:
$ cat laureate.json | groq -pretty ' { "count":count(*。賞賛)、 「ノルウェー人」: *.laureates [BornCountryCode == "no"] {firstName}、 } '
結果:
{ 「カウント」:928、 「ノルウェー人」:[ { 「FirstName」:「Ivar」 }、 { 「FirstName」:「Lars」 }、 … ] }
それをキャッチしますか? GROQクエリは *で始める必要はありません。このクエリでは、値が個別のクエリから生じるJSONオブジェクトを作成しています。これにより、Groqで生産できるものに多くの柔軟性が提供されます。たぶん、あなたは最後の5つのもののリストと一緒に不完全なTODOの総数を望んでいます。または、TODOを2つの別々のリストに分割したい場合があります。1つは完成用、もう1つは不完全です。または、それが別のツール/ライブラリ/フレームワークが期待するものであるため、オブジェクト内にすべてを包む必要があるかもしれません。いずれにせよ、Groqはあなたをカバーしています。
最後の演習を試してみましょう。受賞者には、各受賞者が走った賞品の総数の丸い割合のアレイが含まれているオブジェクトを投影して、受賞者の名を返しますか?次に、配られた総数を出力してみてください。
まとめ
GROQをうまく使用する前に、学ぶ必要があることはあまりありません。エクササイズに従っている場合は、Groqの第一人者になるための大きな道を歩んでいます。当然のことながら、この紹介はGROQのすべてのさまざまな機能と側面に触れていないので、GitHubで仕様とプロジェクト自体を自由に調べてください。そして、GROQと争うデータについて質問がある場合は、Sanity.ioのチームに自由に連絡してください。
回答を行使します
演習1
質問1
[完了== true]を削除すると、完了したものだけでなく、すべてのTODOが取得されます。 {title、userId}を削除すると、すべてのプロパティが取得されます。
質問2
*[userid == 2]
質問3
*[userid == 2 &&完了== false]または *[userid == 2 &&!完了]
質問4
フィルターの順序と投影を変更すると、最初に投影を行い、フィルターを適用します。これは、タイトルとユーザーIDのみを含み、== trueを完了するTODOのリストでフィルタリングしていることを意味します。
質問5
curl https://jsonplaceholder.typicode.com/todos | GROQ '*[完了== true] {title、userId}'> result.json
演習2
質問1
*.laureates [BornCountryCode == "insert-your-country-here"]]
質問2
*.laureates \ [BornCountryCode == "no" \] [-1]
質問3
*[BORNCOUNTRYCODE == "NO"]は、オブジェクトでフィルタリングしようとします。これは意味をなさないので、答えとしてヌルが得られます。
質問4
*.laureates \ [0 \] [BornCountryCode == "no"]は、あなたが思うように機能しません。これにより、最初に最初の受賞者(たまたまウィルヘルムコンラッド)が見つかり、次にオブジェクトを「フィルタリング」しようとします。これは意味がないので、答えはヌルです。
演習3
質問1
*.laureates [死んだ== "0000-00-00"]
質問2
フィルター\ [BornCountryCode == "no" \] [Born> = "1950-01-01"]と[BornCountryCode == "NO" && Born> = "1950-01-01"]に違いはありません。最初のものは2つの「パス」でフィルタリングを行いますが、最終結果は同じです。
質問3
*.laureates ["1973" in prizes []。年]
演習4
質問1
*.laureates [count(prizes)> = 2]
質問2
count(*。受賞者[gender == "female"])
質問3
*.laureates {"fullname":surname "、" firstName}
演習5
*.laureates {"laureates":{firstName、 "percentage":round(count(prizes) / count(*。賞賛[]。賞)、3)*100}、 "total":count(*。
以上がGROQを使用してターミナルのJSONドキュメントをクエリしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









最近GraphQLの作業を開始した場合、またはその長所と短所をレビューした場合、「GraphQLがキャッシュをサポートしていない」または

最近のビットコインの価格が20k $ $ USDを超えており、最近30Kを破ったので、イーサリアムを作成するために深く掘り下げる価値があると思いました

開発者としての段階に関係なく、私たちが完了したタスクは、大小を問わず、個人的および専門的な成長に大きな影響を与えます。

それは' Vueチームにそれを成し遂げてくれておめでとうございます。それは大規模な努力であり、長い時間がかかったことを知っています。すべての新しいドキュメントも同様です。

私はこの非常に正当な質問で誰かに書いてもらいました。 Leaは、ブラウザから有効なCSSプロパティ自体を取得する方法についてブログを書いています。それはこのようなものです。

先日、Corey Ginnivanのウェブサイトから、この特に素敵なビットを見つけました。そこでは、スクロール中にカードのコレクションが互いに積み重ねられていました。

これらのデスクトップアプリがいくつかあり、目標があなたのサイトをさまざまな次元ですべて同時に表示しています。たとえば、書くことができます
