検索
ホームページウェブフロントエンドCSSチュートリアルGROQを使用してターミナルのJSONドキュメントをクエリします

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で試してみるためにいくつかのことで心を運動していることです。

  1. [完了== true]および/または{title、userId}を削除するとどうなりますか?
  2. 2のIDを持つユーザーがすべてのTODOを見つけるためにクエリを変更するにはどうすればよいですか?
  3. 2のIDを持つユーザーが未完成のTodosを見つけるためにクエリを変更するにはどうすればよいですか?
  4. 元のクエリ例のフィルターがプロジェクションと場所を交換するとどうなりますか?
  5. 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. あなたの国からのすべてのノーベル賞受賞者を見つけるために質問を書いてください。
  2. 最後のノルウェーの賞賛者を返すためにクエリを書いてください。ヒント:-1は最後のアイテムを指します。
  3. ルートオブジェクトで直接フィルタリングしようとするとどうなりますか? *[BORNCOUNTRYCODE == "NO"]?
  4. *.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には、フィルター内で使用できる豊富なオペレーターセットがあります。数字と文字列を等しい(==)、等しい(!=)、(>)より大きく、等しい(> =)、(

さらに多くのエクササイズ!

ドリルを知っています。フィルターで少し遊んで、データセットでどのように動作するかを確認してください。もちろん、答えは最後です。

  1. 生きている受賞者を返すクエリを書いてください。
  2. フィルター[BornCountryCode == "NO"] [Born> = "1950-01-01"]と[BornCountryCode == "NO" && Born> = "1950-01-01"]に違いはありますか?
  3. 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、)など、データを変換するための豊富な演算子と機能があります。

演習

うまくいけば、あなたはこの時点で物事に対して良い感覚を得ていますが、ここにここに予測の練習を練習するいくつかの方法があります。

  1. 2つ以上の賞を獲得したすべての受賞者を見つけてください。
  2. 女性が賞金を獲得した賞品の数を見つけてください。
  3. 結果の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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
CSS-Tricks Chronicle XXXVICSS-Tricks Chronicle XXXVIApr 16, 2025 am 10:58 AM

これは、私、このサイト、およびCSS-Tricksファミリーの一部である他のサイトで起こっているこれらの小さなまとめの1つです。

毎週のプラットフォームニュース:絵文字文字列の長さ、丸いボタンの問題、バンドルされた交換毎週のプラットフォームニュース:絵文字文字列の長さ、丸いボタンの問題、バンドルされた交換Apr 16, 2025 am 10:46 AM

今週のラウンドアップでは、2つの絵文字の文字列の長さが必ずしも等しくなく、その丸いボタンを作成する前に検討すべきものがあり、新しいものがあるかもしれません

カクテルミキサーでGraphQLに会うカクテルミキサーでGraphQLに会うApr 16, 2025 am 10:43 AM

GraphQLとRESTは、Webサイトを使用するためにAPIを構築するときに使用される2つの仕様です。 RESTは、アプリケーションが使用する一連の一意の識別子(URL)を定義します

SASSモジュールの導入SASSモジュールの導入Apr 16, 2025 am 10:42 AM

SASSは、他の言語(モジュールシステム)から認識される可能性のある主要な新機能を起動しました。これは@Importにとって大きな前進です。最も使用されているものの1つ

心配をやめ、gitフックが大好きであることを学んだ方法心配をやめ、gitフックが大好きであることを学んだ方法Apr 16, 2025 am 10:41 AM

バージョン制御システムとしてのGITのメリットは争うのが困難ですが、Gitはあなたとあなたのコミットを追跡するために素晴らしい仕事をしますが

SASSをより速くするための概念の証明SASSをより速くするための概念の証明Apr 16, 2025 am 10:38 AM

新しいプロジェクトの開始時に、SASSコンピレーションは瞬く間に起こります。これは、特にbrowsersyncとペアになっている場合は素晴らしい気分です。

形式で再利用可能な反応成分を実証します形式で再利用可能な反応成分を実証しますApr 16, 2025 am 10:36 AM

コンポーネントは、Reactアプリケーションの構成要素です。 Reactアプリケーションを構築し、コンポーネントを使用しないことはほとんど不可能です。それは広まっています

データのフィルタリングクライアント側:CSS、jQuery、およびReactの比較データのフィルタリングクライアント側:CSS、jQuery、およびReactの比較Apr 16, 2025 am 10:35 AM

100の名前のリストがあるとします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。