문제

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이 내가 생각하는 것보다 너무 일반적인 형식일 수도 있습니다.필요에 따라 합산/등 기능을 직접 수행하는 대신 쿼리 언어를 원하는 이유는 사용자 입력을 기반으로 쿼리를 동적으로 작성하기를 원하기 때문입니다."우리는 SQL이 필요하지 않고 필요한 함수만 작성하면 됩니다"라는 주장과 비슷합니다.결국에는 감당할 수 없게 되거나, 점점 더 밀어붙이면서 자신만의 SQL 버전을 작성하게 됩니다.(알겠습니다. 조금 어리석은 주장인 것은 알지만 이해가 되실 겁니다..)

도움이 되었습니까?

해결책

물론, 어떻습니까 :

그들은 모두 약간의 일이 진행되는 것처럼 보이지만 어느 정도까지 일합니다. 그것들은 또한 XPath 및 XQuery와 개념적으로 유사합니다. XML과 JSON은 다른 개념 모델 (계층 vs 객체/구조)을 가지고 있지만.

편집하다 2015 년 9 월 : 실제로 지금 있습니다 JSON 포인터 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)
        };
    });

완전히 확장 가능합니다!

문서는 여전히 진행 중이지만 여전히 온라인으로 시도 할 수 있습니다.

업데이트: 엑스쿼리 3.1 XML이나 JSON 중 하나 또는 둘 다를 함께 쿼리할 수 있습니다.그리고 XPath 3.1 너무 할 수 있습니다.

목록이 늘어나고 있습니다.

jmespath는 정말 쉽고 잘 작동합니다. http://jmespath.org/Amazon에서 AWS Command Line 인터페이스에서 사용되고 있으므로 매우 안정적이어야합니다.

내장 array.filter() 방법 이 소위 JavaScript 쿼리 라이브러리의 대부분을 쓸모 없게 만듭니다

간단한 비교, 시작 등을 상상할 수있는만큼 대의원 내부에 많은 조건을 넣을 수 있습니다. 테스트하지는 않았지만 내부 컬렉션을 쿼리하기 위해 필터도 둥지를 틀 수도 있습니다.

물체 경로 복잡하거나 알려지지 않은 구조의 JSON 문서에 대한 간단하고 Ligthweigth Query 언어입니다. XPath 또는 JSONPATH와 유사하지만 임베디드 산술 계산, 비교 메커니즘 및 내장 기능 덕분에 훨씬 강력합니다.

Example

파이썬 버전은 성숙하고 생산에 사용됩니다. JS는 여전히 베타 상태입니다.

아마도 가까운 시일 내에 본격적인 JavaScript 버전을 제공 할 것입니다. 또한 몽고 쿼리에 대한 간단한 대안으로 작용할 수 있도록 더욱 발전시키고 싶습니다.

JQ a 제이아들 Uery Language는 주로 명령 줄을위한 것이지만 광범위한 프로그래밍 언어 (Java, Node.js, Php, ...)에 바인딩을 제공하며 브라우저에서도 사용할 수 있습니다. JQ-WEB.

다음은 원래 질문을 기반으로 한 삽화입니다.

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

합 (x) 여기서 y> 0 (7과 동일합니다)

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

List (x) 여기서 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}.

.NET을 사용하는 경우 json.net JSON 상단의 LINQ 쿼리를 지원합니다. 이것 게시하다 몇 가지 예가 있습니다. 필터링, 매핑, 그룹화 등을 지원합니다.

이것을 보는 또 다른 방법은 다음을 사용하는 것입니다. 몽고DB JSON을 mongo에 저장한 다음 mongodb 쿼리 구문을 통해 쿼리할 수 있습니다.

좋아,이 게시물은 조금 오래되었지만 ... JS 객체에서 Native JSON (또는 JS Objects)에서 SQL과 같은 쿼리를하고 싶다면 살펴보십시오. https://github.com/deitch/searchjs

JSON에 전적으로 작성된 JSQL 언어 및 참조 구현입니다. "이름 ==="john "&& age === 25를 가진 배열에서 모든 객체를 찾고 싶습니다.

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

참조 구현 SearchJS는 노드 NPM 패키지뿐만 아니라 브라우저에서도 작동합니다.

npm install searchjs

또한 복잡한 결합 및 부정과 같은 일을 할 수 있습니다. 그것은 기본적으로 사건을 무시합니다.

아직 요약이나 계산을하지는 않지만 외부에서 수행하는 것이 더 쉽습니다.

다음은 트릭을 수행 할 간단한 JavaScript 라이브러리가 있습니다.

  • 달러 Q 멋진 가벼운 라이브러리입니다. 그것은 jQuery가 인기있는 체인 구문에 익숙한 느낌을 가지고 있으며 373 SLOC에 불과합니다.
  • Spahql XPath와 유사한 구문을 가진 완전히 추천 쿼리 언어입니다.홈페이지, github
  • Jfunk 진행중인 쿼리 언어이며 CSS/JQuery Selectors와 유사한 구문이 있습니다. 유망 해 보였지만 초기 커밋에서는 아무런 개발도 없었습니다.

  • (2014 년 추가) : the JQ 명령 줄 도구 깔끔한 신뢰도는 있지만 불행히도 AC 라이브러리입니다. 예제 사용 :

    < 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은 내가 말할 수있는 한 가장 유망하고 잘 생각됩니다. 체크 아웃하는 것이 좋습니다.


나는 방금 당신이 찾고 있는 것을 수행하는 클라이언트측 JS-lib(defiant.js)의 릴리스 가능한 버전을 완성했습니다.defiant.js를 사용하면 익숙한 XPath 표현식으로 JSON 구조를 쿼리할 수 있습니다(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에는 몇 가지 다른 기능이 포함되어 있지만 이는 이 주제의 범위를 벗어납니다.누구든지 클라이언트측 XPath 평가기를 사용하여 lib를 테스트할 수 있습니다.나는 XPath에 익숙하지 않은 사람들이 이 평가자가 유용하다고 생각할 것이라고 생각합니다.
http://defiantjs.com/#xpath_evaluator

defiant.js에 대한 추가 정보
http://defiantjs.com/
https://github.com/hbi99/defiant.js

도움이 되셨기를 바랍니다...문안 인사

  1. Google에는이라는 프로젝트가 있습니다 러브 필드; 방금 그것에 대해 알게되었지만 흥미로워 보이지만 밑줄이나 Lodash에 떨어지는 것보다 더 관여합니다.

    https://github.com/google/lovefield

Lovefield는 순수한 JavaScript로 작성된 관계형 쿼리 엔진입니다. 또한 브라우저 측의 지속적인 데이터와 같은 도움을 제공합니다. 그것은 제공합니다 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는 JSON 응답을 반환하는 JavaScript 배열, 컬렉션 및 웹 서비스에서 SQL과 같은 SQL을 수행하는 간단한 방법을 제공합니다. JINQJS는 .NET에 대한 Microsoft의 Lambda 표현식과 유사하며 구문 및 술어 기능과 같은 SQL과 같은 SQL을 사용하여 컬렉션을 쿼리하는 유사한 기능을 제공합니다. Jinqjs의 목적은 LINQ 쿼리에 익숙한 프로그래머에게 SQL과 같은 경험을 제공하는 것입니다.

두 번째는 자신의 JavaScript를 사용한다는 개념을 두 번째하지만 좀 더 정교한 것을 위해서는 볼 수 있습니다. dojo 데이터. 그것을 사용하지 않았지만 당신이 찾고있는 쿼리 인터페이스의 종류를 제공하는 것처럼 보입니다.

현재 JAQL 구현은 Hadoop 클러스터를 사용하여 대규모 데이터 처리를 대상으로하므로 필요한 것보다 더 많을 수 있습니다. 그러나 Hadoop 클러스터없이 쉽게 실행됩니다 (그러나 여전히 Hadoop 코드와 그 종속성이 컴파일되기 위해서는 대부분 포함됩니다). JavaScript에 포함될 수있는 JAQL의 소규모 구현과 A 브라우저는 프로젝트에 큰 도움이 될 것입니다.

위의 예는 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/

당신은 또한 사용할 수 있습니다 aUNDSCORE.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

alterscore.js는 클라이언트 측 및 서버 측 모두에서 작동하며 주목할만한 라이브러리입니다.

당신은 또한 사용할 수 있습니다 로마 이는 더 나은 공연을 가진 coundscore.js의 포크입니다.

가능할 때마다 모든 쿼리를 서버의 백엔드 (SQL DB 또는 기타 기본 데이터베이스 유형)로 전환합니다. 이유는 쿼리를 수행하는 것이 더 빠르고 최적화되기 때문입니다.

JSON은 홀로있을 수 있으며 쿼리 언어를 사용하는 데 +/-가있을 수 있지만 대부분의 JSON을 사용하는 것처럼 백엔드에서 브라우저로 데이터를 검색하는 경우 이점을 볼 수 없습니다. 백엔드에서 쿼리 및 필터링하여 필요한 작은 데이터를 얻으려면 필요합니다.

어떤 이유로 든 프론트 엔드 (주로 브라우저에서)에서 쿼리해야한다면 Array.Filter를 사용하는 것이 좋습니다 (다른 것을 발명하는 이유는 무엇입니까?).

내가 더 유용 할 것이라고 생각하는 것은 JSON의 변환 API라고 말합니다. 일단 데이터가 있으면 여러 가지 방법으로 표시 할 수 있기 때문에 더 유용합니다. 그러나 서버 <-> 클라이언트 모델을 사용하는 경우 클라이언트보다 서버 에서이 작업을 많이 수행 할 수 있습니다.

내 2 펜스 가치 만!

체크 아웃 https://github.com/niclasko/cypher.js (참고 : 나는 저자입니다)

그래프 데이터베이스와 함께 Cypher 그래프 데이터베이스 쿼리 언어의 제로 의존성 JavaScript 구현입니다. 브라우저에서 실행됩니다 (Firefox, Chrome, IE로 테스트).

질문과 관련이 있습니다. JSON 엔드 포인트를 쿼리하는 데 사용할 수 있습니다.

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

다음은 복잡한 JSON 문서를 쿼리하고 이에 대한 분석을 수행하는 예입니다.

cypher.js json 쿼리 예제

당신은 사용할 수 있습니다 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