今天到處都有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”屬性。
讓我們進行一些練習熱身
您可能認為您不需要鍛煉才能完成這篇文章!好吧,好消息是,我們只在詳細介紹更多細節之前,我們只用一些事情來鍛煉頭腦。
- 如果您刪除[完整== true]和/或{title,userId},會發生什麼?
- 您如何更改查詢以查找用戶ID 2的用戶所有Todos?
- 您如何更改查詢以找到用戶ID為2的用戶未完成的戒酒?
- 如果原始查詢示例中的過濾器與投影交換,會發生什麼?
- 您將如何編寫一個單個命令(帶管道)下載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指的是最後一項。
- 如果您嘗試直接在根對像上過濾會發生什麼? *[borncountrycode ==“否”]?
- *。
像上次一樣,答案將在這篇文章的結尾處。
使用過濾器
現在我們知道,總共有12個挪威諾貝爾獎獲得者,其中有多少人在1950年之後出生?弄清Groq沒問題:
$ cat Laureate.json | groq'*.laureates [borncountrycode ==“ no” && bort> =“ 1950-01-01”] {firstName}' - pretty //樣本返回 [ { “ firstName”:“ May-Britt” },, { “ firstName”:“ Edvard I.” } 這是給出的
實際上,Groq擁有一組豐富的操作員,我們可以在過濾器中使用。我們可以比較(==),不等於(!=),大於(>),大於或等於(> =),小於(
更多的練習!
您知道鑽頭:嘗試使用過濾器玩一些,以了解它們如何與數據集使用。當然,答案是最後的。
- 編寫一個返回帶有獲獎者的查詢。
- 過濾器[borncountrycode ==“ no”] [born> =“ 1950-01-01”]
- 您能找到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,
練習
希望此時您對事情有很好的感覺,但是這裡還有一些練習預測工作的方法:
- 找到所有贏得兩個或更多獎項的獲獎者。
- 找到女性贏得了多少獎。
- 格式化一個將結果名稱和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中文網其他相關文章!

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

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

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

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

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