是否有(大致)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)

快速搜索一下谷歌,就会发现人们已经考虑过它并实现了一些东西(JAQL),但它似乎还没有一个标准的用法或库集出现。虽然单独实现每个功能都是相当琐碎的,但如果有人已经做对了,我就不想重新发明轮子。

有什么建议吗?

Edit: This may indeed be a bad idea or JSON may be too generic a format for what I'm thinking.. The reason for wanting a query language instead of just doing the summing/etc functions directly as needed is that I hope to build the queries dynamically based on user-input. Kinda like the argument that "we don't need SQL, we can just write the functions we need". Eventually that either gets out of hand or you end up writing your own version of SQL as you push it further and further. (Okay, I know that is a bit of a silly argument, but you get the idea..)


当前回答

我是一种新的JSON查询语言的开发者,叫做~Q(发音为“unquery”)。它旨在解决其他JSON查询语言的许多缺点,并平衡易用性和表达能力。作为主要开发者,我当然是有偏见的,但你可以自己看看并决定:

https://github.com/xcite-db/Unquery

对于OP的例子,~Q中的查询将是:

{
    "example1:[]" : "$sum(x)?y>0",
    "example2:[]" : ["x?y>0"]
}

其他回答

只要有可能,我就会将所有查询转移到服务器的后端(SQL DB或其他本地数据库类型)。原因是这样查询会更快更优化。

我知道jSON可以是独立的,对于查询语言可能有+/-,但如果您从后端检索数据到浏览器,我看不出它的优势,因为大多数jSON用例都是这样。在后端进行查询和筛选,以获得所需的尽可能小的数据。

如果出于某种原因,你需要在前端进行查询(主要是在浏览器中),那么我建议只使用数组。过滤器(为什么要发明其他东西?)

也就是说,我认为更有用的是json的转换API…它们更有用,因为一旦你有了数据,你可能想要以多种方式显示它。但是,同样,如果您使用的是server<——>客户端模型,那么您可以在服务器上比在客户端上更容易地完成这些工作。

只值我的两便士!

内置的array.filter()方法使大多数所谓的javascript查询库过时

你可以在委托中放入尽可能多的条件:简单的比较,startsWith,等等。我还没有测试过,但是您可能也可以嵌套过滤器来查询内部集合。

据我所知,SpahQL是其中最有前途、考虑最周全的一种。我强烈建议大家去看看。

当前的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/上下载和讨论

谷歌有一个项目叫lovefield;刚刚发现了它,它看起来很有趣,尽管它比键入下划线或lodash更复杂。 https://github.com/google/lovefield

Lovefield是一个用纯JavaScript编写的关系查询引擎。它 还提供了在浏览器端持久化数据的帮助。 使用IndexedDB本地存储数据。它提供了类似sql的语法和 跨浏览器工作(目前支持Chrome 37+, Firefox 31+, IE 10+, Safari 5.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 is a small, simple, lightweight and extensible javaScript library that has no dependencies. jinqJs provides a simple way to perform SQL like queries on javaScript arrays, collections and web services that return a JSON response. jinqJs is similar to Microsoft's Lambda expression for .Net, and it provides similar capabilities to query collections using a SQL like syntax and predicate functionality. jinqJs’s purpose is to provide a SQL like experience to programmers familiar with LINQ queries.