245

JSON を照会するための (大まかに) SQL または XQuery のような言語はありますか?

「Y > 3 である X のすべての値は何ですか」などのクエリに簡単に答えたり、通常の SUM / COUNT 型の操作を実行したりできると便利な、JSON に適切にマップされる非常に小さなデータセットを考えています。

完全に構成された例として、次のようなものがあります。

[{"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 として保持される) と考えています。

簡単なグーグル検索は、人々がそれについて考え、いくつかのもの ( JAQL ) を実装したことを示唆していますが、標準的な使用法やライブラリーのセットはまだ出現していないようです。各機能を単独で実装するのはかなり簡単ですが、誰かがすでに正しく実装している場合、私は車輪を再発明したくありません。

助言がありますか?

編集:これは確かに悪い考えかもしれません.JSONは私が考えているフォーマットにはあまりにも一般的かもしれません.必要に応じて合計/etc関数を直接実行するのではなく、クエリ言語が必要な理由は、私が構築したいからです.ユーザー入力に基づいて動的にクエリを実行します。「SQLは必要ない、必要な関数を書けばいい」という議論のようなものです。最終的には、それが手に負えなくなるか、SQL をさらに推し進めるにつれて独自のバージョンの SQL を作成することになります。(わかりました、それが少しばかげた議論であることは知っていますが、あなたはその考えを理解しています..)

4

23 に答える 23

103

確かに、どうですか:

それらはすべて少し進行中のようですが、ある程度は機能します。また、概念的にはXPathやXQueryに似ています。XMLとJSONの概念モデルは異なりますが(階層型とオブジェクト/構造体)。

2015年9月の編集:実際には、JSONコンテンツの非常にシンプルで効率的なトラバースを可能にするJSONポインター標準があります。正式に指定されているだけでなく、多くのJSONライブラリでもサポートされています。したがって、表現力が限られているため、クエリ言語自体と見なされる場合と見なされない場合がありますが、これを実際に有用な標準と呼びます。

于 2009-04-24T18:28:41.613 に答える
50

私が取り組んでいる 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)
        };
    });

それも完全に拡張可能です!

ドキュメントはまだ作成中ですが、オンラインで試すことができます。

于 2009-04-29T14:49:03.643 に答える
49

更新: XQuery 3.1は、XML または JSON のいずれか、または両方を一緒にクエリできます。そして、XPath 3.1でも可能です。

リストは増え続けています:

于 2011-10-18T18:42:44.523 に答える
18

JMESPath は非常に簡単に機能します: http://jmespath.org/。完全な仕様と、複数の言語用のライブラリがあります。AWS コマンドライン インターフェイスで Amazon によって使用されているため、非常に安定している必要があります。

構文例:

// Select a single item
people[1].firstName

// Select a slice of an array
people[0:5]

// Select all the first names
people[*].firstName

// Select all first names based on search term
people[?state=='VA'].firstName

// Count how many people are over 35
length(people[?age>`35`])

// Select only the name and age of people over 35
people[?age>`35`].{name: name, age: age}

// Join expressions together to sort and join elements into a string
people[?state == 'WA'].name | sort(@) | join(', ', @)

docsには、操作できる実際の例が他にもたくさんあります。

于 2015-09-06T07:34:04.957 に答える
10

組み込みarray.filter()メソッドにより、これらのいわゆる JavaScript クエリ ライブラリのほとんどが廃止されます。

想像できる限り多くの条件をデリゲート内に入れることができます: 単純な比較、startsWith など。私はテストしていませんが、内部コレクションをクエリするためにフィルターをネストすることもできます。

于 2012-02-17T04:21:41.533 に答える
7

.NET を使用している場合、Json.NETは JSON 上の LINQ クエリをサポートします。この投稿にはいくつかの例があります。フィルタリング、マッピング、グループ化などをサポートしています。

于 2009-04-26T02:24:46.563 に答える
7

ObjectPathは、複雑な構造または不明な構造の JSON ドキュメント用のシンプルで軽量なクエリ言語です。XPath や JSONPath に似ていますが、組み込みの算術計算、比較メカニズム、および組み込み関数のおかげで、はるかに強力です。

例

Python のバージョンは成熟しており、本番環境で使用されています。JS はまだベータ版です。

おそらく近い将来、本格的な Javascript バージョンを提供する予定です。また、Mongo クエリのより簡単な代替手段として機能するように、さらに開発したいと考えています。

于 2013-06-23T00:15:16.560 に答える
7

これを確認するもう 1 つの方法は、mongoDBを使用することです。JSON を mongo に保存してから、mongodb クエリ構文を使用してクエリを実行できます。

于 2012-11-08T19:12:43.147 に答える
4

OK、この投稿は少し古いですが... JS オブジェクトでネイティブ JSON (または JS オブジェクト) で SQL のようなクエリを実行したい場合は、https://github.com/deitch/searchjsをご覧ください。

これは、完全に JSON で記述された jsql 言語であり、リファレンス実装でもあります。「name==="John" && age===25 を持つ配列内のすべてのオブジェクトを次のように検索します。

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

リファレンス実装の searchjs は、ブラウザとノード npm パッケージで動作します

npm install searchjs

また、複雑な結合や否定 (NOT) なども実行できます。大文字と小文字はネイティブに無視されます。

合計やカウントはまだ行われていませんが、外部で行う方がおそらく簡単です。

于 2011-08-11T13:03:05.287 に答える
3

これもトリックを実行するいくつかの単純な JavaScript ライブラリです。

  • Dollar Qは素晴らしい軽量ライブラリです。jQuery によって普及したチェーン構文になじみがあり、わずか 373 SLOC です。
  • SpahQLは、XPath (ホームページGithub 、
  • jFunkは進行中のクエリ言語で、構文は CSS/jQuery セレクターに似ています。有望に見えましたが、最初のコミットを超えた開発はありませんでした。

  • (2014 年追加): jq コマンド ライン ツールの構文はきれいですが、残念ながら ac ライブラリです。使用例:

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

于 2012-12-03T21:42:54.720 に答える
2

SpahQL は、私が知る限り、これらの中で最も有望でよく考えられています。チェックアウトすることを強くお勧めします。

于 2013-01-27T14:49:01.803 に答える
1

現在の Jaql 実装は、Hadoop クラスターを使用した大規模なデータ処理を対象としているため、必要以上のものになる可能性があります。ただし、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 }}]

Jaql は、http: //code.google.com/p/jaql/ でダウンロード/議論できます。

于 2009-04-24T21:11:24.437 に答える
1

基本的にスイスナイフライブラリであるUnderscore.jsを使用して、コレクションを操作することもできます。、を使用する_.filter_.pluck_.reduceSQL のようなクエリを実行できます。

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 は、クライアント側とサーバー側の両方で機能する注目すべきライブラリです。

Underscore.js のフォークであるLo-Dashを使用すると、パフォーマンスが向上します。

于 2014-05-24T20:13:32.757 に答える
1

独自の JavaScript を使用するという考えを支持しますが、もう少し洗練されたものについては、dojo dataを参照してください。使用していませんが、探している種類のクエリ インターフェイスをほぼ提供しているようです。

于 2009-04-22T14:42:02.403 に答える