มีภาษาแบบสอบถามสำหรับ JSON หรือไม่


227

มีภาษา SQL หรือ XQuery คล้าย ๆ กับการสืบค้น JSON หรือไม่

ฉันกำลังคิดชุดข้อมูลขนาดเล็กมากที่จับคู่กับ JSON ได้อย่างดีซึ่งจะเป็นการดีที่จะตอบแบบสอบถามอย่างง่ายดายเช่น "ค่าทั้งหมดของ X โดยที่ Y> 3" หรือการดำเนินการชนิด SUM / COUNT ปกติเป็นอย่างไร

ในฐานะที่เป็นตัวอย่างที่ทำขึ้นอย่างสมบูรณ์บางสิ่งเช่นนี้:

[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]

SUM(X) WHERE Y > 0     (would equate to 7)
LIST(X) WHERE Y > 0    (would equate to [3,4])

ฉันคิดว่าสิ่งนี้จะทำงานได้ทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์โดยผลลัพธ์ถูกแปลงเป็นโครงสร้างข้อมูลเฉพาะภาษาที่เหมาะสม (หรืออาจเก็บไว้เป็น JSON)

Googling ฉบับย่อแสดงให้เห็นว่าผู้คนคิดและนำสิ่งเล็ก ๆ น้อย ๆ ( JAQL ) ไปใช้ แต่ดูเหมือนว่าการใช้งานมาตรฐานหรือชุดของห้องสมุดก็ยังไม่เกิดขึ้น ในขณะที่แต่ละฟังก์ชั่นนั้นใช้งานได้เองเล็กน้อยหากมีใครทำถูกต้องแล้วฉันไม่ต้องการคิดค้นวงล้อใหม่

ข้อเสนอแนะใด ๆ

แก้ไข: นี่อาจเป็นความคิดที่ไม่ดีหรือ JSON อาจเป็นรูปแบบที่ธรรมดาเกินไปสำหรับสิ่งที่ฉันคิด .. เหตุผลที่ต้องการภาษาที่ใช้สืบค้นแทนที่จะทำหน้าที่สรุป / อื่น ๆ โดยตรงตามที่ต้องการคือฉันหวังว่าจะสร้าง แบบสอบถามแบบไดนามิกขึ้นอยู่กับการป้อนข้อมูลของผู้ใช้ เหมือนกับอาร์กิวเมนต์ที่ "เราไม่ต้องการ SQL เราสามารถเขียนฟังก์ชันที่เราต้องการได้" ในที่สุดคุณอาจไม่ได้ใช้งานหรือคุณเขียน SQL เวอร์ชันของคุณเองในขณะที่คุณผลักมันไปเรื่อย ๆ (โอเคฉันรู้ว่ามันเป็นเรื่องที่ค่อนข้างงี่เง่า แต่คุณได้ความคิด .. )


ฉันมีความต้องการเช่นกัน ฉันต้องการจับคู่คำขอ JSON ขาเข้าตามค่าเฉพาะที่ตำแหน่งเฉพาะในแผนผังวัตถุ จริง ๆ แล้วแบบสอบถามจะต้องถูกกำหนดค่าโดยผู้ใช้ (power) วิธีแก้ปัญหาปัจจุบันคือการสร้าง make-shift XML จาก JSON และใช้ XPath
Vladimir Dyuzhev

1
มันเป็นเครื่องมือเชลล์มากกว่า แต่jq ( stedolan.github.io/jq ) ยอดเยี่ยมสำหรับการสำรวจข้อมูล json ลองใช้ในสนามเด็กเล่น: jqplay.org
jtmoulia

มีเครื่องมือบนเว็บที่ช่วยให้คุณสามารถเรียกใช้คำสั่ง SQL ในฟีด JSON API ที่สาธารณะหรือที่เป็นsqall.co
สแต็คแมน


แนวคิดเพิ่มเติมที่stackoverflow.com/questions/1955505/…
wisbucky

คำตอบ:


91

แน่นอนว่าเกี่ยวกับ:

พวกเขาทั้งหมดดูเหมือนจะกำลังทำงานอยู่เล็กน้อย แต่ทำงานในระดับหนึ่ง พวกเขายังคล้ายกับ XPath และ XQuery conceptually; แม้ว่า XML และ JSON จะมีโมเดลแนวคิดที่แตกต่างกัน (ลำดับชั้น vs object / struct)

แก้ไขก.ย. 2015: ที่จริงแล้วตอนนี้มีมาตรฐานJSON Pointerที่ช่วยให้การสำรวจเนื้อหา JSON ง่ายและมีประสิทธิภาพมาก ไม่เพียง แต่ถูกระบุอย่างเป็นทางการ แต่ยังสนับสนุนโดยไลบรารี JSON จำนวนมาก ดังนั้นฉันจะเรียกมันว่ามาตรฐานที่เป็นประโยชน์จริงที่แท้จริงแม้ว่าจะมีความหมาย จำกัด แต่ก็อาจหรืออาจไม่ได้รับการพิจารณาว่าเป็น Query Language ต่อ se


77
กล่าวอีกนัยหนึ่งไม่มีอะไรเป็นมาตรฐานและมั่นคง ... :-(
Vladimir Dyuzhev

เมื่อพูดถึงมาตรฐานฉันได้ยินข่าวลือว่า XQuery 3.1 อาจขยายเพื่อรองรับการสืบค้น JSON (คล้ายกับJSONiq ) แน่นอนว่าอาจต้องใช้เวลาพอสมควรเนื่องจาก XQuery 3.0 ยังไม่เปิดตัวอย่างเป็นทางการ
Julien Ribon

โอ้ความเมตตาฉันหวังว่าจะไม่ XML- ทั้งหมด> ความพยายามใน JSON ที่ฉันเคยเห็นมีความยุ่งเหยิงน่ากลัว - โมเดลข้อมูลไม่เข้ากัน แต่ฉันต้องการเห็น JQuery โดยใช้แนวคิดเดียวกันส่วนของไวยากรณ์ เพิ่งปรับเปลี่ยนให้เหมาะสมกับโมเดลข้อมูล JSON
StaxMan

1
สำหรับใครที่กำลังมองหาการติดตั้ง Ruby ของ JSONPath: github.com/joshbuddy/jsonpath
Robert Ross

@GôTô: การใช้ MongoDB ถ้าคุณมีอิสระในการใช้งาน (ดูคำตอบด้านล่างสำหรับตัวอย่างวิธีการแปลเคียวรีเป็นเชลล์ในตัว)
serv-inc

48

ผมอยากแนะนำโครงการของฉันฉันทำงานที่เรียกว่า jLinq ฉันกำลังมองหาความคิดเห็นดังนั้นฉันจึงสนใจที่จะได้ยินสิ่งที่คุณคิด

หากให้คุณเขียนข้อความค้นหาที่คล้ายกับวิธีการที่คุณใช้ใน LINQ ...

var results = jLinq.from(records.users)

    //you can join records
    .join(records.locations, "location", "locationId", "id")

    //write queries on the data
    .startsWith("firstname", "j")
    .or("k") //automatically remembers field and command names

    //even query joined items
    .equals("location.state", "TX")

    //and even do custom selections
    .select(function(rec) {
        return {
            fullname : rec.firstname + " " + rec.lastname,
            city : rec.location.city,
            ageInTenYears : (rec.age + 10)
        };
    });

มันยืดออกได้เต็มที่เช่นกัน!

เอกสารยังอยู่ในระหว่างดำเนินการ แต่คุณยังสามารถลองออนไลน์ได้


@hugoware: มีเอกสารใด ๆ สำหรับสิ่งนี้ จะมีคำสั่งใด ๆ นอกเหนือจาก .starts () (เช่นมี?)
Rikki

5
อัปเดตล่าสุดเมื่อ 8 ปีที่แล้วและไม่มีการตอบสนองต่อการถูกถามว่าโครงการนี้ตายไปแล้ว 5 ปีที่แล้ว ... ฉันคิดว่าโครงการนี้ตายไปแล้ว
cfc

36

ปรับปรุง: XQuery 3.1สามารถสืบค้น XML หรือ JSON - หรือทั้งสองอย่างพร้อมกันได้ และXPath 3.1ก็ทำได้เช่นกัน

รายการกำลังเติบโต:

  • JSONiq (อิงตาม XQuery)
  • UNQL (เช่น SQL)
  • JaQL (ใช้งานได้)
  • JsonPath (เหมือน XPath)
  • Json Query (เรียงลำดับคล้าย XPath)
  • GraphQL (ใช้เทมเพลตพิมพ์)

14

jmespath ทำงานได้ค่อนข้างง่ายและดีhttp://jmespath.org/ มันถูกใช้โดย Amazon ใน AWS อินเตอร์เฟสบรรทัดคำสั่งดังนั้นมันจึงค่อนข้างเสถียร


5
แต่ในเวลาเดียวกันในหน้าเดียวกัน: "หากคุณต้องการคุณสมบัติขั้นสูงที่อาจไม่สามารถทำได้ด้วย - แบบสอบถามคุณสามารถตรวจสอบ jq ซึ่งเป็นตัวประมวลผลบรรทัดคำสั่ง JSON" ดังนั้นดูเหมือนว่า AWS ใช้jmespathสำหรับ--queryพารามิเตอร์ แต่แนะนำjqสำหรับการไพพ์บรรทัดคำสั่ง docs.aws.amazon.com/cli/latest/userguide/ ......
wisbucky

10

JQเป็นJ SON Qภาษา uery ตั้งใจหลักสำหรับบรรทัดคำสั่ง แต่กับการผูกที่หลากหลายของการเขียนโปรแกรมภาษา (Java, Node.js, PHP, ... ) และยังมีอยู่ในเบราว์เซอร์ผ่านJQ เว็บ JQ

ต่อไปนี้เป็นภาพประกอบตามคำถามต้นฉบับซึ่งให้ตัวอย่าง JSON นี้:

 [{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]

SUM (X) WHERE Y> 0 (เท่ากับ 7)

map(select(.y > 0)) | add

LIST (X) WHERE Y> 0 (จะเท่ากับ [3,4])

map(.y > 0)

ไวยากรณ์ jq ขยายไวยากรณ์ JSON

ทุกนิพจน์ JSON เป็นนิพจน์ jq ที่ถูกต้องและนิพจน์เช่น[1, (1+1)]และ {"a": (1 + 1)} `แสดงให้เห็นว่า jq ขยายไวยากรณ์ JSON ได้อย่างไร

ตัวอย่างที่มีประโยชน์มากขึ้นคือนิพจน์ jq:

{a,b}

ซึ่งได้รับค่า JSON {"a":1, "b":2, "c": 3}, {"a":1, "b":2}ประเมิน


8

array.filter()วิธีการในตัวทำให้ส่วนใหญ่ของห้องสมุดแบบสอบถามจาวาสคริปต์ที่เรียกว่าล้าสมัย

คุณสามารถใส่เงื่อนไขมากมายภายในผู้รับมอบสิทธิ์เท่าที่คุณจะจินตนาการได้: เปรียบเทียบแบบง่ายเริ่มด้วย ฯลฯ ฉันยังไม่ได้ทดสอบ แต่คุณอาจซ้อนตัวกรองเพื่อสอบถามคอลเลกชันภายใน


5
array.filter()เป็นส่วนหนึ่งของ JavaScript ไม่ใช่ JSON
เลนซามูเอลแมคลีนผู้อาวุโส

2
JSON เป็นส่วนย่อยของ JavaScript แต่มีภาษาจำนวนมากที่รองรับทั้ง JSON และอาร์เรย์และมีวิธีการใช้ตัวกรองอาร์เรย์จึงเป็นจุดที่ถูกต้อง
dakab

7

หากคุณใช้. NET ดังนั้นJson.NETจึงสนับสนุนการสืบค้น LINQ ที่ด้านบนของ JSON โพสต์นี้มีตัวอย่าง รองรับการกรองการแมปการจัดกลุ่ม ฯลฯ


7

ObjectPathนั้นง่ายและ ligthweigth ภาษาคิวรีสำหรับเอกสาร JSON ของโครงสร้างที่ซับซ้อนหรือไม่รู้จัก มันคล้ายกับ XPath หรือ JSONPath แต่มีประสิทธิภาพมากกว่าด้วยการคำนวณทางคณิตศาสตร์แบบฝังกลไกการเปรียบเทียบและฟังก์ชั่นในตัว

ตัวอย่าง

Python เวอร์ชันเป็นผู้ใหญ่และใช้ในการผลิต JS ยังอยู่ในช่วงเบต้า

อาจเป็นไปได้ในอนาคตอันใกล้นี้เราจะให้บริการ Javascript แบบเต็มรูปแบบ นอกจากนี้เรายังต้องการพัฒนาเพิ่มเติมเพื่อให้สามารถใช้เป็นทางเลือกที่ง่ายกว่าสำหรับการค้นหา Mongo


1
ยกเว้นว่ามันมีเอกสารใด ๆ แทบจะไม่ดังนั้นจึงเป็นเรื่องยากที่จะหาวิธีทำอะไรเช่นค้นหาองค์ประกอบที่มีข้อความเหมือนอะไรบางอย่าง
James O'Brien

1
@ JamesO'Brien ขอบคุณสำหรับคำพูดของคุณ - หากคุณพบว่าการอ้างอิงไม่มีประโยชน์และมีปัญหาเฉพาะในใจแจ้งให้เราทราบที่นี่ - ใครบางคนจะพยายามช่วย ขณะนี้เรากำลังพยายามทำให้เอกสารใช้งานได้ดีขึ้นฉันรักความคิดเห็นของคุณ
Ela Bednarek

ขอบคุณ - ฉันขอบคุณมัน ฉันต้องการใช้ ขณะนี้ฉันกำลังใช้ashphy.com/JSONPathOnlineEvaluator ?
James O'Brien

ไม่สามารถหาวิธีใช้กับ Javascript ได้เนื่องจากเอกสารไม่ครบถ้วน
user3670743

เรากำลังมองหาผู้มีส่วนร่วมในการช่วยเหลือ คุณสามารถเขียนบน Github หรือกลุ่ม google groups.google.com/forum/#!members/objectpathสิ่งที่คุณพยายามจะบรรลุและฉันมั่นใจว่ามีคนตอบคำถามของคุณ
Ela Bednarek

6

อีกวิธีในการดูสิ่งนี้คือการใช้mongoDBคุณสามารถเก็บ JSON ของคุณใน mongo แล้วทำการสืบค้นผ่านทางไวยากรณ์การสอบถาม mongodb


MongoDB ใช้งานได้ดีมาก ดูคำตอบด้านล่างสำหรับตัวอย่างวิธีการใช้
serv-inc

4

ตกลงโพสต์นี้เก่าไปหน่อย แต่ ... ถ้าคุณต้องการค้นหาข้อความคล้าย SQL ใน JSON ดั้งเดิม (หรือวัตถุ JS) บนวัตถุ JS ลองดูที่https://github.com/deitch/searchjs

มันเป็นทั้งภาษา jsql เขียนทั้งหมดใน JSON และการใช้งานอ้างอิง คุณสามารถพูดว่า "ฉันต้องการค้นหาวัตถุทั้งหมดในอาร์เรย์ที่มีชื่อ ===" John "&& age === 25 เป็น:

{name:"John",age:25,_join:"AND"}

การใช้งานการอ้างอิง searchjs ทำงานในเบราว์เซอร์เช่นเดียวกับแพคเกจโหนด npm

npm install searchjs

นอกจากนี้ยังสามารถทำสิ่งต่าง ๆ เช่นการรวมที่ซับซ้อนและการปฏิเสธ (ไม่) มันไม่สนใจกรณี

มันยังไม่รวมหรือนับ แต่มันอาจจะง่ายกว่าที่จะทำสิ่งที่อยู่ข้างนอก


3

ต่อไปนี้เป็นห้องสมุด javascript ง่ายๆที่จะใช้เคล็ดลับ:

  • Dollar Qเป็นห้องสมุดที่มีน้ำหนักเบา มันมีความรู้สึกคุ้นเคยกับไวยากรณ์ของการผูกมัดที่ได้รับความนิยมโดย jQuery และมีเพียง 373 SLOC
  • SpahQLเป็นภาษาคิวรีที่มีคุณลักษณะครบถ้วนซึ่งมีไวยากรณ์คล้ายกับ XPath ( โฮมเพจ , Github
  • jFunkเป็นภาษาคิวรีที่กำลังดำเนินอยู่โดยมีไวยากรณ์คล้ายกับ CSS / jQuery selectors ดูเหมือนว่าจะมีแนวโน้ม แต่ก็ยังไม่มีการพัฒนาใด ๆ

  • (เพิ่ม 2014): เครื่องมือบรรทัดคำสั่ง jqมีไวยากรณ์ที่เรียบร้อย แต่น่าเสียดายที่มันเป็นไลบรารี ac ตัวอย่างการใช้งาน:

    < package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'


3

ในMongoDBนี่คือวิธีการทำงาน (ใน mongo shell มีไดรเวอร์สำหรับภาษาที่คุณเลือก)

db.collection.insert({"x": 2, "y": 0}); // notice the ':' instead of ','
db.collection.insert({"x": 3, "y": 1});
db.collection.insert({"x": 4, "y": 1});

db.collection.aggregate([{$match: {"y": {$gt: 0}}}, 
                         {$group: {_id: "sum", sum: {$sum: "$x"}}}]);
db.collection.aggregate([{$match: {"y": {$gt: 0}}}, 
                         {$group: {_id: "list", list: {$push: "$x"}}}]);

คำสั่งสามคำสั่งแรกแทรกข้อมูลลงในคอลเลกชันของคุณ (เพียงแค่เริ่มmongodเซิร์ฟเวอร์และเชื่อมต่อกับmongoลูกค้า)

อีกสองกระบวนการประมวลผลข้อมูล $matchตัวกรอง$groupใช้sumและและlistตามลำดับ


2

SpahQL เป็นสัญญาที่ดีที่สุดและคิดออกมาดีที่สุดเท่าที่ฉันจะบอกได้ ฉันขอแนะนำให้ลองดู


2


ฉันเพิ่งสร้าง JS-lib (defiant.js) รุ่นที่วางจำหน่ายแล้วที่ทำในสิ่งที่คุณต้องการ ด้วย defiant.js คุณสามารถเคียวรีโครงสร้าง JSON ด้วยนิพจน์ XPath ที่คุณคุ้นเคย (ไม่มีนิพจน์ไวยากรณ์ใหม่เหมือนใน JSONPath)

ตัวอย่างของการทำงาน (ดูได้จากเบราว์เซอร์ที่นี่http://defiantjs.com/defiant.js/demo/sum.avg.htm ):

var data = [
       { "x": 2, "y": 0 },
       { "x": 3, "y": 1 },
       { "x": 4, "y": 1 },
       { "x": 2, "y": 1 }
    ],
    res = JSON.search( data, '//*[ y > 0 ]' );

console.log( res.sum('x') );
// 9
console.log( res.avg('x') );
// 3
console.log( res.min('x') );
// 2
console.log( res.max('x') );
// 4

อย่างที่คุณเห็น DefiantJS ขยายออบเจ็กต์ทั่วโลก JSON ด้วยฟังก์ชั่นการค้นหาและส่งคืนอาเรย์ด้วยฟังก์ชั่นรวม DefiantJS มีฟังก์ชั่นอื่น ๆ อยู่บ้าง แต่อยู่นอกขอบเขตของเรื่องนี้ อย่างไรก็ตามคุณสามารถทดสอบ lib ด้วย XPath Evaluator ของไคลเอ็นต์ได้ ฉันคิดว่าคนที่ไม่คุ้นเคยกับ XPath จะพบว่าตัวประเมินนี้มีประโยชน์
http://defiantjs.com/#xpath_evaluator

ข้อมูลเพิ่มเติมเกี่ยวกับ defiant.js
http://defiantjs.com/
https://github.com/hbi99/defiant.js

ฉันหวังว่าคุณจะพบว่ามีประโยชน์ ... ขอแสดงความนับถือ


ปัจจุบันเป็นไปได้หรือไม่ที่จะรับเส้นทางแบบเต็มไปยังผลลัพธ์
XeniaSis

2
  1. Google มีโครงการที่เรียกว่าlovefield ; เพิ่งค้นพบเกี่ยวกับมันและมันก็ดูน่าสนใจแม้ว่ามันจะมีส่วนเกี่ยวข้องมากกว่าเพียงแค่ลดลงในขีดล่างหรือ Lodash

    https://github.com/google/lovefield

Lovefield เป็นเครื่องมือสืบค้นข้อมูลเชิงสัมพันธ์ที่เขียนด้วย JavaScript บริสุทธิ์ นอกจากนี้ยังให้ความช่วยเหลือเกี่ยวกับข้อมูลที่คงอยู่ในด้านเบราว์เซอร์เช่นการใช้ IndexedDB เพื่อเก็บข้อมูลในเครื่อง มันมีไวยากรณ์เหมือน SQLและทำงานข้ามเบราว์เซอร์ (ปัจจุบันสนับสนุน Chrome 37+, Firefox 31+, IE 10+ และ Safari 5.1 + ...


  1. อีกรายการล่าสุดที่น่าสนใจในพื้นที่นี้เรียกว่าjinqJs

    http://www.jinqjs.com/

    ตรวจสอบตัวอย่างสั้น ๆดูดีและเอกสาร APIดูเหมือนจะเขียนได้ดี


function isChild(row) {
  return (row.Age < 18 ? 'Yes' : 'No');
}

var people = [
  {Name: 'Jane', Age: 20, Location: 'Smithtown'},
  {Name: 'Ken', Age: 57, Location: 'Islip'},
  {Name: 'Tom', Age: 10, Location: 'Islip'}
];

var result = new jinqJs()
  .from(people)
  .orderBy('Age')
  .select([{field: 'Name'}, 
     {field: 'Age', text: 'Your Age'}, 
     {text: 'Is Child', value: isChild}]);

jinqJs เป็นไลบรารี javaScript ขนาดเล็กเรียบง่ายน้ำหนักเบาและสามารถขยายได้ซึ่งไม่มีการพึ่งพา jinqJs จัดเตรียมวิธีง่ายๆในการดำเนินการ SQL เช่นเคียวรีในอาร์เรย์ javaScript คอลเลกชันและบริการบนเว็บที่ส่งคืนการตอบสนอง JSON jinqJs นั้นคล้ายกับนิพจน์แลมบ์ดาของ Microsoft สำหรับ. Net และมีความสามารถที่คล้ายกันในการรวบรวมเคียวรีโดยใช้ SQL เช่นไวยากรณ์และฟังก์ชันการทำงานของกริยา วัตถุประสงค์ของ jinqJs คือการจัดเตรียม SQL like experience ให้โปรแกรมเมอร์ที่คุ้นเคยกับการสืบค้น LINQ


1

ฉันจะสองความคิดของเพียงแค่ใช้ javascript ของคุณเอง แต่สำหรับบางบิตที่มีความซับซ้อนมากกว่าที่คุณอาจมองข้อมูลโดโจ ยังไม่ได้ใช้ แต่ดูเหมือนว่าจะให้ส่วนติดต่อกับแบบสอบถามที่คุณต้องการ


1

การใช้ Jaql ปัจจุบันมีเป้าหมายในการประมวลผลข้อมูลขนาดใหญ่โดยใช้คลัสเตอร์ Hadoop ดังนั้นจึงอาจมีมากกว่าที่คุณต้องการ อย่างไรก็ตามมันจะทำงานได้อย่างง่ายดายโดยไม่ต้องมีคลัสเตอร์ Hadoop (แต่ยังคงต้องใช้รหัส Hadoop และการพึ่งพาเพื่อรวบรวมข้อมูลซึ่งส่วนใหญ่จะรวมอยู่ด้วย) การใช้ Jaql ขนาดเล็กที่สามารถฝังใน Javascript และเบราว์เซอร์จะเป็นส่วนเสริมของโครงการ

ตัวอย่างข้างต้นของคุณเขียนด้วย jaql ได้อย่างง่ายดาย:

$data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}];

$data -> filter $.y > 0 -> transform $.x -> sum(); // 7

$data -> filter $.y > 0 -> transform $.x; // [3,4]

แน่นอนมีอีกมากมายเช่นกัน ตัวอย่างเช่น:

// Compute multiple aggregates and change nesting structure:
$data -> group by $y = $.y into { $y, s:sum($[*].x), n:count($), xs:$[*].x}; 
    // [{ "y": 0, "s": 2, "n": 1, "xs": [2]   },
    //  { "y": 1, "s": 7, "n": 2, "xs": [3,4] }]

// Join multiple data sets:
$more = [{ "y": 0, "z": 5 }, { "y": 1, "z": 6 }];
join $data, $more where $data.y == $more.y into {$data, $more};
    // [{ "data": { "x": 2, "y": 0 }, "more": { "y": 0, "z": 5 }},
    //  { "data": { "x": 3, "y": 1 }, "more": { "y": 1, "z": 6 }},
    //  { "data": { "x": 4, "y": 1 }, "more": { "y": 1, "z": 6 }}]

Jaql สามารถดาวน์โหลด / สนทนาได้ที่http://code.google.com/p/jaql/


1

คุณยังสามารถใช้Underscore.jsซึ่งเป็นไลบรารี swiss-knife เพื่อจัดการกับคอลเลกชัน การใช้_.filter, _.pluck, _.reduceคุณสามารถทำแบบ SQL คำสั่ง

var data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}];

var posData = _.filter(data, function(elt) { return elt.y > 0; });
// [{"x": 3, "y": 1}, {"x": 4, "y": 1}]

var values = _.pluck(posData, "x");
// [3, 4]

var sum = _.reduce(values, function(a, b) { return a+b; });
// 7

Underscore.js ทำงานได้ทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์และเป็นห้องสมุดที่มีชื่อเสียง

คุณยังสามารถใช้Lo-Dashซึ่งเป็นตัวแยกของ Underscore.js ที่มีประสิทธิภาพดีกว่า


1

เมื่อใดก็ตามที่เป็นไปได้ฉันจะเปลี่ยนการสอบถามทั้งหมดไปที่แบ็กเอนด์บนเซิร์ฟเวอร์ (เป็น SQL DB หรือประเภทฐานข้อมูลเนทิฟอื่น ๆ ) เหตุผลก็คือมันจะเร็วขึ้นและมีประสิทธิภาพมากขึ้นในการทำแบบสอบถาม

ฉันรู้ว่า jSON สามารถยืนอยู่คนเดียวและอาจมี +/- สำหรับการใช้ภาษาสืบค้น แต่ฉันไม่เห็นประโยชน์หากคุณกำลังดึงข้อมูลจากแบ็กเอนด์ไปยังเบราว์เซอร์เนื่องจาก JSON ส่วนใหญ่ใช้เคส ค้นหาและกรองข้อมูลที่แบ็กเอนด์เพื่อรับข้อมูลขนาดเล็กที่จำเป็น

ถ้าด้วยเหตุผลใดก็ตามที่คุณต้องการสืบค้นที่ front-end (ส่วนใหญ่อยู่ในเบราว์เซอร์) ฉันขอแนะนำให้ใช้ array.filter (ทำไมต้องคิดค้นสิ่งอื่น)

ที่กล่าวว่าสิ่งที่ฉันคิดว่าจะมีประโยชน์มากขึ้นคือการแปลง API สำหรับ json ... พวกเขาจะมีประโยชน์มากขึ้นตั้งแต่เมื่อคุณมีข้อมูลที่คุณอาจต้องการที่จะแสดงในหลายวิธี อย่างไรก็ตามอีกครั้งคุณสามารถทำสิ่งนี้ได้มากบนเซิร์ฟเวอร์ (ซึ่งสามารถปรับขนาดได้ง่ายกว่า) ในไคลเอนต์ - หากคุณใช้โมเดลเซิร์ฟเวอร์ของไคลเอ็นต์ <-->

เพียง 2 เพนนีของฉันคุ้มค่า!


1

ตรวจสอบhttps://github.com/niclasko/Cypher.js (หมายเหตุ: ฉันเป็นผู้เขียน)

มันเป็นการนำ Javascript ของฐานข้อมูล Cypher มาใช้เป็นศูนย์พึ่งพาภาษาจาวาสคริปต์พร้อมกับฐานข้อมูลกราฟ มันทำงานในเบราว์เซอร์ (ทดสอบกับ Firefox, Chrome, IE)

มีความเกี่ยวข้องกับคำถาม สามารถใช้เพื่อสอบถามจุดปลาย JSON:

load json from "http://url/endpoint" as l return l limit 10

นี่คือตัวอย่างของการสืบค้นเอกสาร JSON ที่ซับซ้อนและการวิเคราะห์เอกสาร:

ตัวอย่างการสืบค้น JSON ของ Cypher.js


1

PythonQL มีไวยากรณ์ฝังตัวที่ IMHO คือการปรับปรุงใน SQL ยิ่งเพราะ group, window, where, letฯลฯ สามารถผสมได้อย่างอิสระ

$ cat x.py
#coding: pythonql
data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
q = [x match {'x': as x, 'y': as y} in data where y > 0]
print(sum(q))
print(list(q))

q = [x match {'x': as x, 'y': as y} as d in data where d['y'] > 0]
print(sum(q))

รหัสนี้แสดงคำตอบสำหรับคำถามของคุณสองแบบขึ้นอยู่กับความต้องการของคุณในการจัดการโครงสร้างทั้งหมดหรือเพียงแค่มูลค่า การดำเนินการให้ผลลัพธ์ที่คาดหวัง

$ python x.py
7
[3, 4]
7

0

linq.jsคุณสามารถใช้

สิ่งนี้อนุญาตให้ใช้การรวมและการเลือกจากชุดข้อมูลของวัตถุเช่นเดียวกับข้อมูลโครงสร้างอื่น ๆ

var data = [{ x: 2, y: 0 }, { x: 3, y: 1 }, { x: 4, y: 1 }];

// SUM(X) WHERE Y > 0     -> 7
console.log(Enumerable.From(data).Where("$.y > 0").Sum("$.x"));

// LIST(X) WHERE Y > 0    -> [3, 4]
console.log(Enumerable.From(data).Where("$.y > 0").Select("$.x").ToArray());
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.