Indexeddb 是否可以在ydn db中编写类似SQL的查询;在;或多个“;及;条款?
我正在尝试编写一个查询,该查询在SQL中类似于:Indexeddb 是否可以在ydn db中编写类似SQL的查询;在;或多个“;及;条款?,indexeddb,ydn-db,Indexeddb,Ydn Db,我正在尝试编写一个查询,该查询在SQL中类似于: select * from WorkOrder wo where wo.userId = 1 and wo.isSynced = 0 and wo.status in ('COMPLETE', 'REJECTED', 'SUSPENDED_NO_ACCESS', 'SUSPENDED_OTHER'); 我已经添加了一个关于userId、isSynced和status的索引 如果我像下面这样构建一个查询,只要我只过滤两个不
select * from WorkOrder wo
where wo.userId = 1
and wo.isSynced = 0
and wo.status in ('COMPLETE', 'REJECTED', 'SUSPENDED_NO_ACCESS', 'SUSPENDED_OTHER');
我已经添加了一个关于userId、isSynced和status的索引
如果我像下面这样构建一个查询,只要我只过滤两个不同的状态值,它就可以工作。只要我添加3个或更多,它就不会返回任何结果。我是做错了什么,还是需要用完全不同的方式来处理
//this works
var keyRange = ydn.db.KeyRange.bound([userId, 0, Status.Complete],
[userId, 0, Status.REJECTED]);
//this doesn't work
var keyRange = ydn.db.KeyRange.bound([userId, 0, Status.Complete],
[userId, 0, Status.Suspended_AccessUnavailable],
[userId, 0, Status.REJECTED]);
var iterator = new ydn.db.IndexValueIterator(Store.WorkOrder, 'userId, isSynced, status', keyRange);
return db.values(iterator)
目前,多查询(“IN”)和自连接(“and”)都是手动的,需要大量的样板文件来完成。对于这种情况下的复杂查询,将需要使用内存内排序
用于自联接
使用多个游标进行多查询。简要说明如下:
var iters = [];
var keys = ['COMPLETE', 'REJECTED', 'SUSPENDED_NO_ACCESS', 'SUSPENDED_OTHER'];
for (var i = 0; i < keys.length; i++) {
iters[i] = ydn.db.IndexValueIterator.where('WorkOrder', 'status', '=', keys[i]);
});
var results = [];
db.scan(function(cursors) {
// here we have four cursors for respective four index keys.
// calculate lowest key(s) and put into result
var min_i = ...
results.push(cursors[i].getValue());
// prepare next cursor iteration,
var next_position = [];
next_position[min_i] = true; // advance lowest cursor to next position, while keeping the rest of cursor hold in current position.
return next_position;
}, iters, 'readonly', ['WorkOrder']).then(function() {
// use results
console.log('results', results);
}, function(e) {
console.error(e.stack);
});
谢谢你的回复。老实说,我没有理解所有的内容,所以我刚刚执行了多个查询,然后把结果合并到内存中。抱歉,这是一个典型的问题。没有SQL数据库吗?我不认为这是一个复杂的查询。如果我直接使用索引xDB,是否可能?检查包装器库?
var query = db.from('WorkOrder').where('status', 'in', ['COMPLETE', 'REJECTED', 'SUSPENDED_NO_ACCESS', 'SUSPENDED_OTHER']);
query.list().then(function() {
// use results
console.log('results', results);
}, function(e) {
console.error(e.message);
});