目錄
讓我們安裝groq
讓我們進行一些練習熱身
查詢諾貝爾獎獲得者
更多練習!
使用過濾器
更多的練習!
使用預測
練習
一次做更多
概括
鍛煉答案
問題3
首頁 web前端 css教學 查詢終端中的JSON文檔與GROQ

查詢終端中的JSON文檔與GROQ

Apr 14, 2025 am 09:40 AM

查詢終端中的JSON文檔與GROQ

今天到處都有JSON文檔,但是它們很少像想要的那樣結構。它們通常包含過多的數據,具有怪異命名的字段,或將數據放在不必要的嵌套對像中。圖形相關對象查詢(GROQ)是一種查詢語言(例如SQL,但不同),旨在直接在JSON文檔上使用。它基本上使您可以編寫可以快速過濾的查詢,然後重新格式化JSON文檔,以使其成為最方便的形狀。

GROQ是由Sanity.io(用作主要查詢語言)開發的。它是開源的,它為我們提供了內置的方式,可以在任何JSON源上使用JavaScript和命令行中使用它。我們一起將GROQ添加到終端工具包中,每當您需要將一些JSON數據爭吵時,這將節省您的時間。

讓我們安裝groq

像大多數事情一樣,我們需要安裝GROQ CLI工具,並可以使用終端中的NPM(或YARN)進行操作:

 $ npm install -G groq -cli
登入後複製

為了使用它,我們需要有一個JSON文件。我們將使用Curl下載todo數據的示例數據集:

 $ curl -o todos.json https://jsonplaceholder.typicode.com/todos
登入後複製

讓我們快速查看數據中的示例項目:

 {
  “用戶ID”:1,
  “ id”:1,
  “ title”:“ dlectus aut autem”,
  “完成”:false
},,
登入後複製

非常簡單。我們有一個用戶ID,一個待辦事項ID,一個待辦事項標題和一個布爾值,指定待辦事項是否已完成。

現在,讓我們運行一個基本的groq查詢:查找所有已完成的戒酒,但僅返回TODO標題和用戶ID。可以復制/粘貼這一行,因為我們會稍微瀏覽它的意思。

 $ cat todos.json | groq'*[完整== true] {title,userId}' -  pretty
登入後複製

GROQ命令行工具接受標準輸入的JSON文檔。這與“做一件事並在文本流一起工作”的Unix哲學非常有效。為了從文件中讀取JSON,我們將使用CAT命令。另請注意,GROQ默認情況下將在一條線上輸出最小的JSON,但是通過傳遞,我們獲得了一個很好的縮進和突出顯示的語法。

為了存儲結果,我們可以使用>:

 $ cat todos.json | groq'*[postate == true] {title,userId}'> result.json
登入後複製

查詢本身由三個部分組成:

  • *指數據集(即JSON文件中的數據)。
  • [已完成== true]是一個濾鏡,它刪除了標記為不完整的項目。
  • {title,userId}是一個投影,它導致查詢僅返回“ title”和“ userId”屬性。

讓我們進行一些練習熱身

您可能認為您不需要鍛煉才能完成這篇文章!好吧,好消息是,我們只在詳細介紹更多細節之前,我們只用一些事情來鍛煉頭腦。

  1. 如果您刪除[完整== true]和/或{title,userId},會發生什麼?
  2. 您如何更改查詢以查找用戶ID 2的用戶所有Todos?
  3. 您如何更改查詢以找到用戶ID為2的用戶未完成的戒酒?
  4. 如果原始查詢示例中的過濾器與投影交換,會發生什麼?
  5. 您將如何編寫一個單個命令(帶管道)下載JSON並使用GROQ處理的命令?

我們將答案放在帖子的結尾,供您參考。

查詢諾貝爾獎獲得者

TODO數據非常適合進行熱身,但是說實話:看看使用拉丁語作為佔位符內容的列表不是很有動力。但是,諾貝爾獎擁有所有過去的獲獎者的數據集,可公開使用。

這是樣本返回:

 {
  “獲獎者”:[
    {
      “ id”:“ 1”,
      “ firstName”:“ Wilhelm Conrad”,
      “姓”:“röntgen”,
      “天生”:“ 1845-03-27”,
      “死”:“ 1923-02-10”,
      “ borncountry”:“普魯士(現在是德國)”,
      “ borncountrycode”:“ de”,
      “ BornCity”:“ Lennep(現在是Remscheid)”,
      “二歲”:“德國”,
      “ DIDCOUNTRYCODE”:“ DE”,
      “二歲”:“慕尼黑”,
      “性別”:“男性”,
      “獎品”:[...],
    },,
    // ...
  這是給出的
}
登入後複製

啊!這更有趣!讓我們下載數據集並找到所有挪威獲獎者的名字。在這裡,我們將使用 - 輸出標誌進行捲曲以將數據保存到文件。

 $ curl -輸出勞埃特(Laureate.json)
$ cat Laureate.json | groq'*.laureates [borncountrycode ==“ no”] {firstName}'-pretty
登入後複製

你回來什麼?我收到了12個挪威諾貝爾獎獲得者。不錯!

請注意,此查詢不像我們寫的第一個查詢。我們在這個中有一個額外的.laureates。當我們在TODO數據集中使用 *時,它代表了整個JSON文檔,該文檔包含在TODO數據集的頂級陣列中。另一方面,獲獎文件在頂級列表中存儲在“獲獎者”屬性中的頂級對象

要訪問特定項目,我們可以使用過濾器[0]並僅返回名字。應該告訴我們誰是挪威人是誰贏得諾貝爾獎。

 $ cat Laureate.json | groq'*.laureates [borncountrycode ==“ no”] {firstName} [0]' -  pretty

//返回的對象
{
  “ firstName”:“ ivar”
}
登入後複製

更多練習!

我們將不願意使用此新數據集來查看查詢的工作原理。

  1. 寫一個查詢,以查找您自己國家的所有諾貝爾獎獲得者。
  2. 寫一個查詢以返回最後的挪威獲獎者。提示:-1指的是最後一項。
  3. 如果您嘗試直接在根對像上過濾會發生什麼? *[borncountrycode ==“否”]?
  4. *。

像上次一樣,答案將在這篇文章的結尾處。

使用過濾器

現在我們知道,總共有12個挪威諾貝爾獎獲得者,其中有多少人在1950年之後出生?弄清Groq沒問題:

 $ cat Laureate.json | groq'*.laureates [borncountrycode ==“ no” && bort> =“ 1950-01-01”] {firstName}' -  pretty

//樣本返回
[
  {
    “ firstName”:“ May-Britt”
  },,
  {
    “ firstName”:“ Edvard I.”
  }
這是給出的
登入後複製

實際上,Groq擁有一組豐富的操作員,我們可以在過濾器中使用。我們可以比較(==),不等於(!=),大於(>),大於或等於(> =),小於(

更多的練習!

您知道鑽頭:嘗試使用過濾器玩一些,以了解它們如何與數據集使用。當然,答案是最後的。

  1. 編寫一個返回帶有獲獎者的查詢。
  2. 過濾器[borncountrycode ==“ no”] [born> =“ 1950-01-01”]
  3. 您能找到1973年贏得獎金的所有獲獎者嗎?

使用預測

諾貝爾獎數據集將每個獲獎者的名字和姓氏分開,但是如果我們想將它們結合在一起成一個領域,該怎麼辦? Groq中的預測可以做到這一點!

 *。
  “名稱”:firstName“”姓氏, 
  出生,
  “ prizecount”:count(獎品),
}
登入後複製

運行此查詢告訴我們,May-Britt Moser和Edvard Moser獲得了一個獎項(實際上是同一獎項):

 [
  {
    “名稱”:“ May-Britt Moser”,
    “天生”:“ 1963-01-04”,
    “ prizecount”:1
  },,
  {
    “名稱”:“ Edvard I. Moser”,
    “天生”:“ 1962-04-27”,
    “ prizecount”:1
  }
這是給出的
登入後複製

這裡發生了什麼?好吧,當我們在groq中撰寫投影時,我們真正寫的是一個JSON對象。以前,我們有簡單的投影(例如{firstName}),但這是寫入{“ firstName”:firstName}的快捷方式。通過使用擴展的對象語法,我們可以重命名鍵並轉換值。

GROQ具有一組豐富的運算符和用於轉換數據的功能,包括字符串串聯,算術運算符( - , *, *, /,%,**),計數數組(count(count(prizes))和圓形數字(round(num,num,

練習

希望此時您對事情有很好的感覺,但是這裡還有一些練習預測工作的方法:

  1. 找到所有贏得兩個或更多獎項的獲獎者。
  2. 找到女性贏得了多少獎。
  3. 格式化一個將結果名稱和firstName組合在結果中的fullname鍵。

一次做更多

觀看以下內容:

 $ cat Laureate.json | groq -pretty'
{
  “計數”:count(*。獲獎),
  “挪威人”: *。 
}
'
登入後複製

結果:

 {
  “計數”:928,
  “挪威人”:[
    {
      “ firstName”:“ ivar”
    },,
    {
      “ firstName”:“ lars”
    },,
    …
  這是給出的
}
登入後複製

抓到嗎? GROQ查詢不必從 *開始。在此查詢中,我們正在創建一個JSON對象,其中值是由單獨的查詢產生的。這為我們使用GROQ產生的東西提供了很大的靈活性。也許您希望戒酒的總數以及最後五個列表的列表。或者,也許您想將招待員分為兩個單獨的列表:一個用於完成,一個用於不完整。或者,也許您需要將所有內容包裝在對像中,因為這是另一個工具/庫/框架所期望的。無論如何,Groq都可以覆蓋。

讓我們嘗試最後一個練習。您可以投影一個獲獎者包含一個陣列的對象,其中每個獲獎者已經運行的獎品總數的圓形百分比,並返回了獲獎者的名字?然後,嘗試輸出分發出的總數。

概括

在從GROQ中獲得一些充分利用之前,您不需要學習太多。如果您遵循了練習,那麼您將成為成為Groq Guru的好途徑。自然,此介紹不會涉及GROQ的所有不同功能和方面,因此請隨時在Github上探索規範和項目本身。如果您對Groq的數據爭吵有疑問,請隨時與Sanity.io接觸。

鍛煉答案

練習1
問題1

如果您刪除[已完成== true],您將獲得所有戒酒,而不僅僅是完成的戒酒。如果刪除{title,userId},則將獲得所有屬性。

問題2
 *[userId == 2]
登入後複製
問題3
 *[userId == 2 &&完成== false]或 *[userId == 2 &&!已完成]
登入後複製
問題4

如果更改過濾器的順序和投影,則將首先進行投影,然後應用過濾器。這意味著您要過濾在僅包含標題和用戶ID的Todos列表中,並且已完成== True永遠是不正確的。

問題5
 curl https://jsonplaceholder.typicode.com/todos | groq'*[postate == true] {title,userId}'> result.json
登入後複製
練習2
問題1
 *。
登入後複製
登入後複製
登入後複製
問題2
 *。
登入後複製
登入後複製
登入後複製
問題3

*[borncountrycode ==“否”]將嘗試在對像上過濾。這沒有任何意義,因此您將獲得無效的答案。

問題4

*.laureates \ [0 \] [borncountrycode ==“ no”]無法正常工作。這將首先找到第一個獲獎者(恰好是Wilhelm Conrad),然後嘗試“過濾”對象。這是沒有意義的,因此答案是無效的。

練習3
問題1
 *。
登入後複製
登入後複製
登入後複製
問題2

過濾器\ [borncountrycode ==“ no” \] [born> =“ 1950-01-01”]第一個在兩個“通過”中進行過濾,但最終結果是相同的。

問題3
 *.laureates [“ 1973”獎品[]
登入後複製
練習4
問題1
 *.laureates [count(獎品)> = 2]
登入後複製
問題2
計數(*。獲獎[性別==“女性”])
登入後複製
問題3
 *.laureates {“ fullname”:surname“,” firstName}
登入後複製
練習5
 *.laureates {“獲獎者”:{firstName,“百分比”:round(count(count(prizes) / count(*。獲獎[]。
登入後複製

以上是查詢終端中的JSON文檔與GROQ的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1655
14
CakePHP 教程
1414
52
Laravel 教程
1307
25
PHP教程
1253
29
C# 教程
1227
24
Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

如何通過CSS選擇第一個類名為item的子元素? 如何通過CSS選擇第一個類名為item的子元素? Apr 05, 2025 pm 11:24 PM

在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...

為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? 為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? Apr 05, 2025 pm 05:51 PM

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? 在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? Apr 05, 2025 pm 10:21 PM

在前端開發中如何實現類似Windows...

See all articles