我在标签上存储了 multiEntry 索引。
{ tags: [ 'tag1', 'tag2', 'tag3' ] }
我也有标签列表的查询。
[ 'tag2', 'tag1', 'tag4' ]
我需要获取包含查询中标记之一的所有记录(类似于 SQL OR 语句)。
目前我找不到任何其他解决方案,除了在查询中迭代标签并按商店中的每个标签进行搜索。
有没有更好的解决方案?
谢谢你。
我在标签上存储了 multiEntry 索引。
{ tags: [ 'tag1', 'tag2', 'tag3' ] }
我也有标签列表的查询。
[ 'tag2', 'tag1', 'tag4' ]
我需要获取包含查询中标记之一的所有记录(类似于 SQL OR 语句)。
目前我找不到任何其他解决方案,除了在查询中迭代标签并按商店中的每个标签进行搜索。
有没有更好的解决方案?
谢谢你。
除了迭代之外,您不能用一个查询检索所有结果。您可以通过打开从最低值到最高值的索引来优化搜索结果:
IDBKeyRange.bound ('tag1', 'tag4');
您可以使用的其他 Indexed-Db 功能是打开多个查询并在查询完成时合并结果。这种方式会比迭代快得多。
正如 Deni Mf 回答的那样,IndexedDB 只有范围查询。
OR 查询只是多个查询的联合。那可能没问题。
如果你想要高效的查询,你必须迭代游标并根据需要寻找游标位置。使用我的图书馆,它将是
tags = ['tag2', 'tag1', 'tag4'];
tags.sort();
iter = new ydn.db.KeyIterator('store name', 'tags', IDBKeyRange.bound(tags[0], tags[tags.length-1]);
keys = [];
i = 0;
var req = db.open(iter, function(cursor) {
if (tags.indexOf(cursor.indexKey()) >= 0) {
// we got the result
if (keys.indexOf(cursor.key()) == -1) { // remove duplicate
keys.push(cursor.key());
}
} else {
return tags[++i]; // jump to next index position.
}
);
req.done(function() {
db.list('store name', keys).done(function(results) {
console.log(results);
}
});
请注意,该算法没有误报检索。首先进行key only查询,这样我们就不会浪费在反序列化上。只有我们在删除重复项后获得所有主键才能检索结果。