是否有(大致)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..)
jq是一种JSON查询语言,主要用于命令行,但绑定到广泛的编程语言(Java, node.js, php,…),甚至可以通过jq-web在浏览器中使用。基于c语言的jq实现通常被称为“jq”,基于go语言的版本被称为“gojq”。
以下是基于原始问题的一些插图,以JSON为例:
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(X) WHERE Y > 0(等于7)
map(select(.y > 0)) | add
LIST(X) WHERE 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}。
如果你使用python, MongoDB有迷你开源版本,
MontyDB https://github.com/davidlatwe/montydb
它在github上有500多颗星,并且得到了JetBrains的支持。
from montydb.utils import MontyList
response = [
{'namespace': 'dash_mantine_components',
'props': {'checked': True,
'id': {'index': 0, 'type': 'checkbox'},
'label': 'My first to do'},
'type': 'Checkbox'},
{'namespace': 'dash_mantine_components',
'props': {'checked': True,
'id': {'index': 1, 'type': 'checkbox'},
'label': 'My Another to do'},
'type': 'Input'},
{'namespace': 'dash_mantine_components',
'props': {'checked': False,
'id': {'index': 2, 'type': 'checkbox'},
'label': 'My next level to do'},
'type': 'Div'},
]
cli = MontyList(response)
cli.find({'props.checked': True},{'type':1})
输出:
MontyList([{'type': 'Checkbox'}, {'type': 'Input'}])
与其他jsonquery选项相比,我更喜欢这个库,因为这个库提供了与MongoDB相同的感觉。
你也可以使用Underscore.js,它基本上是一个瑞士刀库来操作集合。使用_。过滤器,_。勇气,_。减少你可以做类似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
js可以在客户端和服务器端工作,是一个著名的库。
你也可以使用Lo-Dash,它是Underscore.js的一个分支,性能更好。