10

我一直在寻找一种方法来执行复杂的查询,例如 SQL 可以执行但完全是客户端。我知道我可以从服务器上执行 SQL 查询获得我想要的确切结果,我什至可以 AJAX 让它看起来很流畅。然而,出于可扩展性、性能和带宽的原因,我更愿意在所有客户端都这样做。

一些要求:

  • 广泛的浏览器兼容性。任何可以运行 jQuery 的东西都可以。我实际上更喜欢它是一个 jQuery 插件。
  • 可以对多个列进行排序。例如,按州字母顺序排列,并按字母顺序列出每个州内的所有城市。
  • 可以过滤结果。例如,相当于“where state = 'CA' or 'NY' or 'TX'”。
  • 必须完全在客户端工作,因此用户只需要下载大量数据一次,并且可以根据需要剪切数据,而无需不断从服务器获取数据,并且实际上能够在初始拉取后离线执行所有查询。

我在 stackoverflow 上环顾四周,发现了 jslinq,但它最后一次更新是在 2009 年,并且没有文档。我也不知道它是否可以执行更复杂的查询,例如在两个不同的列上排序或执行“and”或“or”过滤。

我认为这样的事情已经完成了。我知道 HTML5 是从这条路开始的,但后来遇到了障碍。我只需要基本查询,不需要连接或任何东西。有谁知道可以做到这一点的东西?谢谢。

编辑:我认为我应该包括一个用例来帮助澄清我在寻找什么。

例如,我有一份美国 5000 个最大城市的列表。每条记录都包括 Cityname、State 和 Population。我希望能够一次下载整个数据集并用它填充一个 JS 数组,然后,仅在客户端,能够运行如下查询并从结果记录中创建一个表。

  • 加州十大城市
  • 所有以“S”开头且人口超过 1,000,000 的城市。
  • 加利福尼亚州、纽约州、佛罗里达州、得克萨斯州和伊利诺伊州的三个最大城市,按州字母顺序排列,然后按人口排列。即加利福尼亚,洛杉矶,3,792,621;加利福尼亚,圣地亚哥,1,307,402;加利福尼亚、圣何塞、945,942...等。

所有这些查询都可以通过 SQL 完成,但我不想继续来回访问服务器,我也希望允许离线使用。

4

7 回答 7

11

看看http://linqjs.codeplex.com/

它可以轻松满足您的所有要求。

于 2012-06-11T01:08:22.483 回答
5

只要数据可以作为对象数组放入内存,您就可以使用sortand filter。例如,假设您要过滤产品。您想查找低于 5 美元或高于 100 美元的所有产品,并且希望按价格排序(升序),如果有两种价格相同的产品,则按制造商排序(降序)。你可以这样做:

var results = products.filter(function(product) {
    // price is in cents
    return product.price < 500 || product.price > 10000;
});
results.sort(function(a, b) {
    var order = a.price - b.price;
    if(order == 0) {
        order = b.manufacturer.localeCompare(a.manufacturer);
    }
    return order;
});

为了跨浏览器的兼容性,只需 shim filter

于 2012-06-11T01:12:59.057 回答
5

试试Alasql.js。这是一个 javascript 客户端 SQL 数据库。

您可以使用连接和分组进行复杂的查询,甚至可以优化连接和位置。它不使用 WebSQL。

您的需求支持:

  • 广泛的浏览器兼容性 - 所有现代版本的浏览器,包括手机。
  • 可以对多个列进行排序。- Alasql 使用 ORDER BY 子句进行排序。
  • 可以过滤结果。- 带有 WHERE 子句。
  • 必须完全在客户端工作,因此用户只需要下载大量数据一次,并且可以根据需要剪切数据,而无需不断从服务器获取数据,并且实际上能够在初始拉取后离线执行所有查询。- 可以使用纯 JavaScript(Array.push() 等)操作来修改数据(不要忘记设置 table.dirty 标志)。

这是一个简单的示例(在jsFiddle中使用它):

// Fill table with data
var person = [ 
    { name: 'bill' , sex:'M', income:50000 },
    { name: 'sara' , sex:'F', income:100000 },
    { name: 'larry' , sex:'M', income:90000 },
    { name: 'olga' , sex:'F', income:85000 },
];

// Do the query
var res = alasql("SELECT * FROM ? person WHERE sex='F' AND income > 60000", [person]);
于 2014-11-06T07:32:50.113 回答
0

雅虎的YQL怎么样?我只是简单地看过它,但它看起来很有趣。

于 2012-06-11T01:11:37.543 回答
0

Backbone是一个非常好的 js 库,它(他们的话)“通过提供具有键值绑定和自定义事件的模型、具有可枚举函数的丰富 API 的集合、具有声明性事件处理的视图,并将其全部连接到RESTful JSON 接口上的现有 API。”

我不确定这是否是您正在寻找的,但您可以使用它来模拟您的模型并将事件侦听器绑定到它。似乎是一个很好的教程,可以了解它的一些基本用途。

于 2012-06-11T01:15:14.907 回答
0

您可以使用CanJS。它是一个相对较新的库,性能优于 Backbone 和其他库,它基于臭名昭著的 JavaScript MVC 库。实际上,它是带有一点香料的 JS MVC 的 MVC 部分。

您可以通过 net.tutsplus.com http://net.tutsplus.com/tutorials/javascript-ajax/diving-into-canjs-part-3/看看这个 tut

它非常强大和快速。具有实时绑定等功能,让您的生活变得轻松。

于 2012-06-11T01:34:08.267 回答
0

Coils 是一个 Clojurescript 框架,可编译为 Javascopt,并具有如下客户端 SQL 查询:

(go
    (log (sql "SELECT * FROM test_table where name = ?" ["shopping"] )))

:它是传递给服务器端关系数据库的完整 SQL:

https://github.com/zubairq/coils

于 2014-10-31T13:33:07.207 回答