persistence.js使用“in”运算符进行过滤

时间:2011-12-13 04:46:47

标签: javascript persistence

我在persistence.js(http://persistencejs.org/)中返回的查询集合上使用filter方法遇到了一些有趣的行为

以下是我在调试器中运行的一些示例代码:

Bookmark.all().list(function(items){items.forEach(function(item){console.log(item.id)})})
undefined
SELECT `root`.id AS bookmarks_shs_id, `root`.`name` AS `bookmarks_shs_name`, `root`.`url` AS `bookmarks_shs_url` FROM `bookmarks_shs` AS `root`  WHERE 1=1 []
0
1
2

显然,数据库中保存了三个Bookmark个对象,每个对象的id为0,1和2.

但是,当我尝试使用运算符“in”过滤掉对象时。它开始返回一些时髦的结果。

Bookmark.all().filter('id','in',[0,1,2]).list(function(items){items.forEach(function(item){console.log(item.id)})})
undefined
SELECT `root`.id AS bookmarks_shs_id, `root`.`name` AS `bookmarks_shs_name`, `root`.`url` AS `bookmarks_shs_url` FROM `bookmarks_shs` AS `root`  WHERE (1=1 AND `root`.`id` IN (?, ?, ?)) [0, 1, 2]

这个查询的结果都没有,过滤器本身不返回任何东西,这有点奇怪,考虑到我刚刚确认数据库中肯定有与这些参数匹配的对象。我也尝试了一个简单的相等测试。

Bookmark.all().filter('id','=',0).list(function(items){items.forEach(function(item){console.log(item.id)})})
undefined
SELECT `root`.id AS bookmarks_shs_id, `root`.`name` AS `bookmarks_shs_name`, `root`.`url` AS `bookmarks_shs_url` FROM `bookmarks_shs` AS `root`  WHERE (1=1 AND `root`.`id` = ?) [0]

再次,没有命中。可能最奇怪的是如果我运行这个:

Bookmark.all().filter('id','<',2).list(function(items){items.forEach(function(item){console.log(item.id)})})
undefined
SELECT `root`.id AS bookmarks_shs_id, `root`.`name` AS `bookmarks_shs_name`, `root`.`url` AS `bookmarks_shs_url` FROM `bookmarks_shs` AS `root`  WHERE (1=1 AND `root`.`id` < ?) [2]
0
1
2

但是2绝对不会少于2.我做错了什么?过滤器函数不会像这样工作似乎有点奇怪,特别是当它输出适当的SQL查询时。

更新 看起来这是@nrabinowitz解决方案的组合。我做了一些挖掘,结果发现在persistence.js的源代码中声明的默认idType是VARCHAR(32)。这解释了不良行为。

0 个答案:

没有答案