如何使用 YDN-DB 在 keypath 之后获取下一个元素

Posted

技术标签:

【中文标题】如何使用 YDN-DB 在 keypath 之后获取下一个元素【英文标题】:How to get the next element after keypath using YDN-DB 【发布时间】:2014-10-22 10:10:51 【问题描述】:

我正在尝试构建一个函数,该函数在传递的 keypath 之后检索存储中的下一个元素。我的 getItem 看起来像这样。

req = smartpigsdb.get(store, keypath);
req.done(function(record)  
    if(record!==undefined || typeof record=='object')
    // do something with the record

else console.log('error getItem: ' + e);
);
req.fail(function(e) 
    console.log(e);
);

如何使用 YDN-DB 实现这一目标?

【问题讨论】:

【参考方案1】:

如果您不知道密钥,则不能使用get。您必须使用values 来进行迭代记录。限制为 1,这样您就只能得到一个结果。你可以使用你的know key的lowerBound keyRange,这样你就会得到key之后的下一个对象。

【讨论】:

我快到了。我创建了一个 ValueIterator: var iter = new ydn.db.ValueIterator(store, '>', idx);要获得数据库中的下一项,我会这样做: db.values(iter, 1).done(function(item) console.log('JSON.stringify(item)););但我的密钥路径可能像“1”、“3”、“3a”、“3b”、...、“10”、“11”、“11a”...等等。我想在“ 1" 这是项目 keypath = "2" 但我得到的是 keypath = "10" 的项目。如何检索所需的项目?在我的情况下“2”感谢您的帮助。弗罗林 Indexeddb 排序键根据 ICU 排序,所以“10”在“2”之前。您可能想改用数字类型键。 顺便说一句,你的意思是key,而不是keyPath。这两个是不同的。【参考方案2】:

最后我做了这样的事情,它有效,但我不确定是不是最好的方法。 'idx' 是存储对象存储的索引。

var range = new ydn.db.KeyRange.lowerBound(index+1);
var iter = new ydn.db.Iterator(store, 'idx', range); // 'idx' is an index for store object store
db.values(iter, 1).done(function(item) 
    if(item.length > 0)
        var req = db.get(store, item[0]);
        req.done(function(record) 
            if(record!==undefined || typeof record=='object')
                // do soemthing with the record 
            
            else 
                console.log('record could not be found');
            
        );
        req.fail(function(e) 
            console.log(e);
        );
    
);

如果我想检索以前的记录,我用range = new ydn.db.KeyRange.upperBound(index); 尝试了同样的事情,但我总是从商店获得第一条记录,所以我改用range = new ydn.db.KeyRange.lowerBound(index-1);

请给我一些反馈。再次感谢图书馆。 问候,弗洛林。

【讨论】:

试试db.from('store').where('idx', '>', index).get().done(... ? 是的,我刚试过。但不是 .get() 从上面我使用 list(1) 像这样: smartpigsdb.from(store).where('idx', '>', index).list(1).done(function(item) if(item!==null || item!==undefined) doSomething(item[0]); else console.log('no item found'); );当我尝试使用相同的语法来获取上一项时,它会直接跳转到数据库中的第一项。我不知道为什么。

以上是关于如何使用 YDN-DB 在 keypath 之后获取下一个元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 YDN-DB 的 IndexedDB:如何在多个过滤器上查询对象存储

使用 YDN-DB 的 IndexedDB:如何确定对象存储是不是存在

如何在 ydn-db 中实现内部连接?

如何将数据从 ydn-db Web 应用程序同步到后端服务器?

YDN-DB 密钥生成器 TypeScript

YDN-DB - 删除数据库,然后在页面加载/重新加载时重新创建和加载,但在刷新时不加载