搜尋
首頁web前端css教學查詢終端中的JSON文檔與GROQ

查詢終端中的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
兩個圖像和一個API:我們重新著色產品所需的一切兩個圖像和一個API:我們重新著色產品所需的一切Apr 15, 2025 am 11:27 AM

我最近找到了一種動態更新任何產品圖像的顏色的解決方案。因此,只有一種產品之一,我們可以以不同的方式對其進行著色以顯示

每周平台新聞:第三方代碼,被動混合內容,連接最慢的國家的影響每周平台新聞:第三方代碼,被動混合內容,連接最慢的國家的影響Apr 15, 2025 am 11:19 AM

在本週的綜述中,燈塔在第三方腳本上闡明了燈光,不安全的資源將在安全站點上被阻止,許多國家連接速度

託管您自己的非JavaScript分析的選項託管您自己的非JavaScript分析的選項Apr 15, 2025 am 11:09 AM

有很多分析平台可幫助您跟踪網站上的訪問者和使用數據。也許最著名的是Google Analytics(廣泛使用)

它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭Apr 15, 2025 am 11:01 AM

該文檔負責人可能不是網站上最迷人的部分,但是其中所處的內容對於您的網站的成功也一樣重要

JavaScript中的Super()是什麼?JavaScript中的Super()是什麼?Apr 15, 2025 am 10:59 AM

當您看到一些稱為super()的JavaScript時,在子類中,您會使用super()調用其父母的構造函數和超級。訪問它

比較不同類型的本機JavaScript彈出窗口比較不同類型的本機JavaScript彈出窗口Apr 15, 2025 am 10:48 AM

JavaScript具有各種內置彈出API,它們顯示用於用戶交互的特殊UI。著名:

為什麼可訪問的網站如此難以構建?為什麼可訪問的網站如此難以構建?Apr 15, 2025 am 10:45 AM

前幾天,我與一些前端人們聊天,講述了為什麼這麼多公司努力創建可訪問的網站。為什麼可訪問的網站如此艱難

'隱藏”屬性顯然很弱'隱藏”屬性顯然很弱Apr 15, 2025 am 10:43 AM

有一個HTML屬性,它可以正是您認為應該做的:

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版

SublimeText3 Mac版

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