سؤال

هل هناك لغة (تقريبا) SQL أو شبيهة تشبه XQuery للاستعلام عن JSON؟

أفكر في مجموعات البيانات الصغيرة جدا التي تخطط بشكل جيد إلى JSON حيث سيكون من الرائع بسهولة الإجابة عن استفسارات مثل "ما هي جميع قيم x حيث y> 3" أو للقيام بعمليات نوع المبلغ / العدد المعتاد.

كما هو موضح تماما مثال، شيء مثل هذا:

[{"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 بسرعة إلى أن الناس فكروا في ذلك ونفذوا بعض الأشياء (جاقل)، لكن الأمر لا يبدو وكأنه استخدام قياسي أو مجموعة من المكتبات قد ظهر حتى الآن. في حين أن كل وظيفة تافهة إلى حد ما لتنفيذها بمفردها، إذا قام شخص ما بذلك بشكل صحيح، فأنا لا أريد إعادة اختراع العجلة.

أي اقتراحات؟

عدل الاستعلامات بناء على إدخال المستخدم بشكل حيوي. كيندا مثل الحجة التي "لا نحتاج إلى SQL، يمكننا فقط كتابة المهام التي نحتاجها". في نهاية المطاف أن إما يخرج عن السيطرة أو ينتهي بكتابة إصدار الإصدار الخاص بك من SQL وأنت تدفعه أكثر وأكثر. (حسنا، أعلم أن هذا هو القليل من الوسيطة السخيفة، لكنك تحصل على الفكرة ..)

هل كانت مفيدة؟

المحلول

بالتأكيد، ماذا عن:

يبدو أنهم جميعا يعملون قليلا جارية، لكنهم يعملون إلى حد ما. كما أنها تشبه XPath و xquery من الناحية النظرية؛ على الرغم من أن XML و JSON لديها نماذج مفاهيمية مختلفة (كائن / بنية / بنية هرمية).

تعديل Sep-2015: في الواقع هناك الآن مؤشر جون المعيار الذي يسمح اجتياز بسيط جدا وفعال من محتوى JSON. ليس من المحدد رسميا فقط، ولكن أيضا مدعومة من قبل العديد من مكتبات JSON. لذلك أود أن أسميها معيار مفيد حقيقي حقيقي، على الرغم من أن تعبيرها المحدود قد يكون أو لا يعتبر لغة الاستعلام في حد ذاته.

نصائح أخرى

أود أن أوصى مشروعي أنا أعمل على دعا 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)
        };
    });

انها توسع تماما جدا!

لا تزال الوثائق قيد التقدم، لكن لا يزال بإمكانك تجربة ذلك عبر الإنترنت.

تحديث: XQuery 3.1. يمكن الاستعلام إما XML أو JSON - أو كليهما معا. و XPath 3.1. يمكن أيضا.

القائمة تنمو:

JMespath يعمل حقا سهلة للغاية وبصحة جيدة، http://jmespath.org/يتم استخدامه بواسطة Amazon في واجهة سطر الأوامر AWS، لذلك يجب أن تكون مستقرة تماما.

المدمج array.filter() طريقة يجعل معظم هذه لمكتبات استعلام JavaScript ما يسمى

يمكنك وضع العديد من الحالات داخل المندوب حيث يمكنك أن تتخيل: مقارنة بسيطة، StartSwith، إلخ. لم أختبر ولكن ربما يمكنك العشوا مرشحات أيضا للاستعلام عن المجموعات الداخلية.

outsepath. هو لغة الاستعلام البسيطة والجهاز Ligthweigth وثائق JSON من هيكل مجمع أو غير معروف. إنه يشبه XPath أو JSONPATE، ولكن أكثر قوة أكثر قوة على الحسابات الحسابية المضمنة وآليات المقارنة والوظائف المدمجة.

Example

نسخة بيثون ناضجة وتستخدم في الإنتاج. JS لا يزال في بيتا.

ربما في المستقبل القريب سوف نقدم نسخة جافا سكريبت كاملة. نريد أيضا تطويره كذلك، بحيث يمكن أن يكون بمثابة بديل أبسط لاستفسارات Mongo.

jq. هو جابن س:لغة uery، مخصصة لها أساسا لسطر الأوامر ولكن مع الارتباطات إلى مجموعة واسعة من لغات البرمجة (Java، node.js، PHP، ...) وحتى متوفرة في المتصفح عبر jq-web..

فيما يلي بعض الرسوم التوضيحية المستندة إلى السؤال الأصلي، والتي أعطت هذا JSON كمثال:

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

مجموع (x) حيث y> 0 (يساوي 7)

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

قائمة (x) حيث y> 0 (سيساوي [3،4])

map(.y > 0)

Syntax 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}.

إذا كنت تستخدم .NET ثم json.net. يدعم استفسارات LINQ على الجزء العلوي من JSON. هذه بريد لديه بعض الأمثلة. وهو يدعم الترشيح، ورسم الخرائط، والتجميع، إلخ.

طريقة أخرى للنظر في ذلك سيكون استخدام mongodb. يمكنك تخزين JSON الخاص بك في Mongo ثم استفسره عبر بناء جملة استعلام MongoDB.

حسنا، هذا المنصب قديم قليلا، ولكن ... إذا كنت ترغب في القيام باستعلام تشبه SQL في JSON الأصلي (أو كائنات JS) على كائنات JS، نلقي نظرة على https://github.com/deitch/sechjs.

إنها لغة JSQL مكتوبة بالكامل في JSON، وتنفيذ مرجعي. يمكنك أن تقول، "أريد أن أجد كل كائن في صفيف يحتوي على اسم ===" John "&& Age === 25 ك:

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

يعمل التطبيق المرجعي في المستعرض في المتصفح وكذلك حزمة NPM العقدة

npm install searchjs

يمكن أن تفعل أشياء مثل الإنضمام المعقدة والنفي (لا). انها تتجاهل فقط القضية.

إنه لا يفعل التلخيص أو الاعتماد، ولكن من المحتمل أن يكون من الأسهل القيام بأولئك بالخارج.

إليك بعض مكتبات JavaScript البسيطة التي ستقوم أيضا بالحيلة:

  • الدولار س هي مكتبة خفيفة الوزن لطيفة. لديها شعور مألوف في بناء جملة الذكار جعل شعبية من قبل jQuery ويبلغ سوى 373 سلوك.
  • spahql. هي لغة استعلام مميزة بالكامل مع بناء جملة مماثل ل XPath (الصفحة الرئيسية, جيثب
  • JFunk هو لغة الاستعلام المررحة، مع بناء جملة مشابه ل CSS / JQuery Streeors. بدا واعدا، لكن لم يكن لديه أي تطور خارج الالتزام الأولي.

  • (أضيفت 2014): أداة سطر الأوامر JQ لديه بناء جملة أنيق، ولكن لسوء الحظ انها مكتبة التيار المتردد. مثال على الاستخدام:

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

في mongodb., هذه هي الطريقة التي سيعملها (في شل منغو، هناك برامج تشغيل لغز لغة من اختيارك).

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, ، على التوالى.

Spahql هو الأكثر واعدة ومتقدمة جيدا من هذه، بقدر ما أستطيع أن أقول. أنا أوصي التدقيق بها.


لقد انتهيت للتو من نسخة قابلة لإشداف من Clientside 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 على عدد قليل من الوظائف الأخرى ولكن تلك خارج نطاق هذا الموضوع. Anywho، يمكنك اختبار LIB مع مقيم XPath Clientside. أعتقد أن الناس ليسوا على دراية XPath سيجدون هذا المقيم مفيد.
http://defiantjs.com/#xpath_evaluator.

مزيد من المعلومات حول Defiant.js
http://defiantjs.com/
https://github.com/hbi99/defiant.js.

آمل أن تجد أنه مفيد ... التحيات

  1. جوجل لديه مشروع يسمى ميدان الحب; ؛ اكتشفت للتو حول هذا الموضوع، وأنها تبدو مثيرة للاهتمام، على الرغم من أنها متورطة أكثر من مجرد إسقاط في السطر أو لوداش.

    https://github.com/google/lovefield.

Lovefield هو محرك الاستعلام العلائقي مكتوب في جافا سكريبت نقي. كما يوفر مساعدة في الاستمرار في البيانات على جانب المتصفح، على سبيل المثال باستخدام 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 هي مكتبة جافا سكريبت صغيرة وبسيطة وخفيفة الوزن ومتوسطة لا تحتوي على تبعيات. يوفر Jinqjs طريقة بسيطة لأداء SQL مثل الاستعلامات على صفائف JavaScript والمجموعات وخدمات الويب التي ترجع استجابة JSON. يشبه Jinqjs تعبير Lambda الخاص ب Microsoft .NET، ويوفر إمكانيات مماثلة لمجموعات الاستعلام باستخدام SQL Sommonax ووظائف المسند. غرض Jinqjs هو توفير تجربة SQL مثل للمبرمجين المطلعين على استفسارات LINQ.

سأكون ثاني فكرة فقط باستخدام جافا سكريبت الخاصة بك، ولكن بالنسبة لشيء أكثر تطورا قليلا قد تنظر إليه دوجو بيانات. وبعد لم تستخدمه ولكن يبدو أنه يمنحك تقريبا نوع واجهة الاستعلام التي تبحث عنها.

يستهدف تنفيذ 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 }}]

يمكن تحميلها / مناقشتها في http://code.google.com/p/jaql/

تستطيع ايضا استخذام underscore.js. وهو أساسا مكتبة سكين سويسرية لمعالجة المجموعات. استخدام _.filter, _.pluck, _.reduce يمكنك القيام باستفسارات SQL تشبه 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 كل من جانب العميل وخادم الجانب ومكتبة ملحوظة.

تستطيع ايضا استخذام لو اندفاعة وهو شوكة من السندات الإنمائية.

كلما كان ذلك ممكنا، أتحول كل الاستعلام إلى الخلفية على الخادم (إلى SQL DB أو نوع قاعدة البيانات الأصلية الأخرى). السبب يجري هو أنه سيكون أسرع وأكثر حسما للقيام بالاستعلام.

أعلم أن JSON يمكن أن يكون موقفا ويمكن أن يكون هناك +/- للحصول على لغة استعلام ولكن لا يمكنني رؤية الميزة إذا كنت تسترجع البيانات من الخلفية إلى متصفح، لأن معظم حالات استخدام JSON. الاستعلام والتصفية في الخلفية للحصول على بيانات صغيرة مطلوبة.

إذا كنت بحاجة إلى أي سبب تحتاج إلى الاستعلام عند الطرف الأمامي (في معظمها في متصفح)، أود أن أقترح فقط باستخدام Array.filter (لماذا اختراع شيء آخر؟).

وقال إن ما أعتقد أنه سيكون أكثر فائدة هو API للتحويل عن JSON ... فهي أكثر فائدة منذ ذلك بمجرد أن تكون لديك البيانات التي قد ترغب في عرضها بعدة طرق. ومع ذلك، مرة أخرى، يمكنك القيام بالكثير من هذا على الخادم (والذي يمكن أن يكون من الأسهل بكثير الحجم) من العميل - إذا كنت تستخدم الخادم <-> طراز العميل.

فقط بلدي 2 بنس يستحق!

الدفع https://github.com/niclasko/cypher.js. (ملاحظة: أنا المؤلف)

إنه تطبيق جافا سكريبت صفرية من لغة الاستعلام عن قاعدة بيانات الرسوم البيانية الرسم البيانية مع قاعدة بيانات الرسم البياني. يعمل في المتصفح (تم اختباره مع Firefox، Chrome، IE).

بأهمية بالسؤال. يمكن استخدامه للاستعلام عن نقاط نهاية JSON:

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

إليك مثال على الاستعلام عن وثيقة JSON معقدة وتحليل أداء عليه:

مثال Cypher.js JSON Query

يمكنك استخدام 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>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top