あるクエリ言語のJSON?
-
13-09-2019 - |
質問
が(ほぼ)の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る人について考えたことは、実は数え上げればきりがない(JAQLがんのように聞こえるかもしれない標準的な使用方法や設定の図書館が登場しました。てそれぞれの機能はかなり簡単に実装するための独自の場合、人は生きてこないです、ごめんなさい再発明をするつもりはありま
ご意見募集
編集:この場合それは悪いことまたはJSONすぎる可能性があり汎用形式ときに、考えてい..理由はたいという問い合わせ言語だけでなくやっての総括/などの機能を直接必要に応じてあるいはクエリをダイナミックにユーザー入力します。ちょっとのように"という議論を必要としていSQLまでの機能をいう意味が込められています。最終的にそのどちらの手だと思います書面をご版のSQLして最後までしっかりと押し込みまるらしいです。(大丈夫をもたらすであろうと確信しては愚の引数でご利用いただけます。うに..)
他のヒント
私は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)
};
});
それはあまりにも完全に拡張可能です!
ドキュメントはまだ進行中ですが、あなたはまだそれをオンラインで試すことができます。
jmespathも実際にはかなり簡単で働き、 http://jmespath.org/する it'sはかなり安定するようになったので、それは、AWSコマンドラインインターフェイスにAmazonが使用されてます。
のほとんどになりのビルトイン array.filter()
方法これらの時代遅れのJavaScriptクエリライブラリを、いわゆる
あなたが想像できるようデリゲート内など多くの条件を置くことができる:単純な比較、のstartsWithなど、私がテストしていませんが、あなたはおそらく巣は、内側のコレクションを照会するために、あまりにもフィルタリングできます。
。ObjectPath に複雑または未知の構造のJSONドキュメントのシンプルかつligthweigthクエリ言語です。これは、埋め込まれた算術計算、比較メカニズムと組み込み関数のおかげでのXPathまたはJSONPathに似てますが、はるかに強力です。
Pythonのバージョンが成熟し、生産に使用されています。 JSはまだベータ版です。
おそらく近い将来、我々は本格的なJavascriptのバージョンを提供します。我々はまた、モンゴクエリに単純代替として機能することができるように、さらにそれを開発したいです。
jq は J息子 query言語では、主にコマンドラインがバインディング、幅広いプログラミング言語(Java、node.js php,...)をご利用のブラウザ経由 jq-ウェブ.
こちらのイラストの問題は、このJSONを例として:
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(XがY>0のように相当す7)
map(select(.y > 0)) | add
リスト(XがY>0のように相当す[3,4])
map(.y > 0)
jq書式]広JSON文
毎JSON表現が有効なjq表現などの表現 [1, (1+1)]
と{"a":(1+1)}`を説明すかjq extends JSON構文です。
より有の例としては、jqの発現:
{a,b}
る、JSON値 {"a":1, "b":2, "c": 3}
, に評価し {"a":1, "b":2}
.
これを見てする別の方法を使用することです MongoDBののあなたMongoの中であなたのJSONを格納し、MongoDBのクエリ構文を経由して、それを照会することができます。
OK、ペンダントヘッドの販売は少し古いですが---おすすめのSQLようなクエリのネイティブJSON(JSオブジェクト)に関JS物にこれらを実現するために、 https://github.com/deitch/searchjs
でもjsql言語記述すべてJSONで、参考に実装されます。と言ってもいいでしょうしていきたい"すべてのオブジェクト配列が名前==="スカイプを通じたコミュニティ&&年齢===25:
{name:"John",age:25,_join:"AND"}
リファレンス実装ではsearchjsのブラウザなどのノードとしてnpmパッケージ
npm install searchjs
もできないような複雑な接合や否定(いない).でネイティブを無視します。
いない集計またはcountがかりやすいと言えます。
こちらは簡単なjavascriptライブラリもん:
- ドルQ 素敵な軽量化図書館があります。でおなじみのチェーンの構文した人気のjQueryによる、海373.
- SpahQL は十分な機能を有するクエリ言語の構文に似たXPath(ホームページ, Github
jFunk が進行中のクエリ言語、文法と同様CSS/jQueryセレクタ.つまでたって有望なものなの開発を超えて初期コミットする
(2014年):の jqコマンドラインツール はっきり書式が、残念なことであるcライブラリ。使用例:
< package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'
に Pythonの, ここではどのように作業のもんごういか殻存在するドライバーのための言語選択).
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
クライアント)
SpahQLは、私の知る限り、最も有望と同様にこれらの外に考えられています。私は非常にそれをチェックアウトをお勧めします。
私はちょうどあなたが探しているものを行い、クライアント側のJS-LIB(defiant.js)の剥離可能なバージョンを終えました。 defiant.jsでは、あなたが(JSONPathのように新しい構文式)に精通してXPath式でJSON構造を照会することができます。
例(ここでは、ブラウザでそれを見るます。http:// defiantjs .COM / defiant.js /デモ/ 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は、いくつかの他の機能が含まれていますが、それらはこの主題のスコープ外です。
とにかく、あなたはクライアント側のXPath評価者とのlibをテストすることができます。私は、XPathに慣れていない人は、この評価者が便利になると思います。
http://defiantjs.com/#xpath_evaluatorする
詳しい情報
http://defiantjs.com/ の
https://github.com/hbi99/defiant.jsする
私はあなたがそれが役に立つことを願っ... よろしく
Googleでは、プロジェクトとして lovefield;だからそれについては、それが面白い、かわりだけでは落ちにアンダースコアはlodash.
Lovefieldは関係索エンジンの言語で書かれてます。で も支援を続データをブラウザ側では、例えば使用IndexedDBデータを格納する。を提供す SQLによく似た構文 や 作品のクロスブラウザ(現支援Chrome37+,Firefox31+IE 10+、Safari5.1+...
もう一つの興味深い作品というこのスペース jinqJs.
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の ラムダ発現します。ネットで同様の機能を クエリを用いた集、SQLのように述語構文可能です。jinqJsのを提供するもので、具体的には、SQLのような体験プログラマー 身近にLINQクエリ.
私の第二の概念だけで、自分のjavascriptが、ちょっと高い見 道場データ.ないようにも見えますと、別の種類のクエリインターフェース、またはます。
あなたが必要以上かもしれませんので、Hadoopクラスタを使用して、現在のJaql実装ターゲット大規模なデータ処理。しかし、それはHadoopクラスタなく、容易に実行されます(まだほとんどが含まれているHadoopのコードとその依存関係コンパイル取得することが必要)。 JavaScriptで埋め込むことができるJaqlの小さな実装とブラウザがプロジェクトには絶好のに加えだろう。
あなたの例では、上記の簡単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 }}]
も利用できます Underscore.js は基本的にスイスナイフを図書館に操作します。を使用 _.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-ダッシュ であるフォークのUnderscore.js よりよい。
私は(SQL DBや他のネイティブデータベースタイプに)サーバー上のバックエンドへのクエリのすべてをシフトする可能な限り。理由ビーイングは、それがより速く、より多くのクエリを実行するために最適化されたことになるということです。
私は、JSONをスタンドアロンすることができ、クエリ言語を持つために+/-があるかもしれませんが、あなたはJSONのユースケースのほとんどとして、ブラウザにバックエンドからデータを取得している場合、私は利点を見ることができないことを知っています。バックエンドでのクエリとフィルタが必要とされているような小さなデータを取得します。
何らかの理由であなたはフロントエンド(ほとんどのブラウザで)で照会する必要がある場合、私はちょうど(なぜ他の何かを発明?)array.filterを使用することをお勧めします。
私はより有用だと思うものを言ったことは、彼らはあなたがデータを持っていたら、あなたはいくつかの方法でそれを表示することもできますので、より便利です... JSONの変換APIです。 < - >サーバーを使用している場合 - しかし、再び、あなたがクライアント上より(スケールがはるかに簡単することができます)、サーバー上でこのの多くを行うことができます。クライアントモデルを
ちょうど私の2ペンスの価値!
チェック https://github.com/niclasko/Cypher.jsする(ノート:私は著者です)。
これは、グラフデータベースと一緒にサイファーグラフデータベースのクエリ言語のゼロ依存JavaScript実装です。それは、(Firefoxの、クロム、IEでテスト済み)ブラウザで実行されます。
の質問に関連して。 JSONのエンドポイントを照会するために使用することができます:
load json from "http://url/endpoint" as l return l limit 10
ここでは、複雑なJSONドキュメントを照会し、その上で解析を行う例です。
<のhref = "https://niclasko.github.io/CypherJS/?load%20json%20from%20%22https://raw.githubusercontent.com/niclasko/niclasko.github.io/master/data /week_2018_38.json%22%20as%20l%20with%20collect(l)%20as%20rows%20unwind%20rows%20as%20row%20unwind%20row[%27values%27]%20as%20v%20with%20rows[0] .datasource%20as%20datasource、%20row.key [0] .EN%20as%20series、%20collect(%7BD:%の20V [0]、%20V:%の20V [1]%の7D)の%20as%20C、% 20stdev(V [1])%20as%20series_std_dev、%20sum(V [1])/カウント(1)%20as%20series_avg%20unwind%20C%20as%20E%20return%20datasource、%20series、%20tostring(toDateまで( ED))%20as%20date、%20e.v%20as%20val、20%(EV-series_avg)/ series_std_dev%20as%20val_z_score、%20series_std_dev、%20series_avg」REL = "nofollowをnoreferrer"> Cypher.js JSONクエリ例の
あなたが使用することができます linq.js
するます。
これは、他の構造のデータとして、オブジェクトのデータ・セットから集計及びselectingsを使用することができます。
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>