目次
GROQをインストールしましょう
いくつかのエクササイズでウォームアップしましょう
ノーベル賞受賞者の照会
その他のエクササイズ!
フィルターを使用します
さらに多くのエクササイズ!
プロジェクションの操作
演習
一度にもっとや​​っています
まとめ
回答を行使します
質問3
ホームページ ウェブフロントエンド CSSチュートリアル GROQを使用してターミナルのJSONドキュメントをクエリします

GROQを使用してターミナルのJSONドキュメントをクエリします

Apr 14, 2025 am 09:40 AM

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 までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

GraphQLキャッシングの使用 GraphQLキャッシングの使用 Mar 19, 2025 am 09:36 AM

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

Redwood.jsと動物相を使用してイーサリアムアプリを構築します Redwood.jsと動物相を使用してイーサリアムアプリを構築します Mar 28, 2025 am 09:18 AM

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

Eleventyで独自のBragdocを作成します Eleventyで独自のBragdocを作成します Mar 18, 2025 am 11:23 AM

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

Vue 3 Vue 3 Apr 02, 2025 pm 06:32 PM

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

ブラウザから有効なCSSプロパティ値を取得できますか? ブラウザから有効なCSSプロパティ値を取得できますか? Apr 02, 2025 pm 06:17 PM

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

CI/CDで少し CI/CDで少し Apr 02, 2025 pm 06:21 PM

「ウェブサイト」は「モバイルアプリ」よりも適していると言いますが、Max Lynchからのこのフレーミングが好きです。

粘着性のあるポジショニングとサスのダッシュを備えた積み重ねられたカード 粘着性のあるポジショニングとサスのダッシュを備えた積み重ねられたカード Apr 03, 2025 am 10:30 AM

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

レスポンシブデザインのブラウザを比較します レスポンシブデザインのブラウザを比較します Apr 02, 2025 pm 06:25 PM

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

See all articles