你如何做类似 gun.get({startkey, endkey}) 的事情?
2 回答
@qwe123wsx @sebastianmacias 为延迟道歉!原贴于:https ://github.com/amark/gun/issues/479
电线规范对此有一个协议,但尚未实现。它看起来像这样:
gun.on('out', {get: {'#': {'>': 'a', '<': 'b'}}});
但是,这还行不通。我会建议:
(1) 分页行为从一个应用程序到另一个应用程序非常不同,我们很难创建“一刀切”的解决方案,因此如果您可以实现自己的*分页并制作它,这将非常有帮助可作为用户模块使用,然后我们可以从您的经验中学习(哪些有效,哪些无效)并将最佳解决方案作为核心的一部分。
(2) 你的应用可能在没有分页的情况下可以正常工作,虽然它可以构建(它是针对 1.0 之后的目标),然后随着你的应用变得更流行,它应该很容易添加,不需要太多重构,一旦你需要它并且它是可用的。
... * 如何建立自己的?
很多关于这方面的好文章,我见过的最好的一篇来自 Neo4j 关于如何在图形数据库中做到这一点(也适用于枪)https://graphaware.com/neo4j/2014/08/20/ graphaware-neo4j-timetree.html。
另一个粗略的想法是您根据分页或时间对数据进行建模。因此,不是将所有推文都放入用户的推文表,而是用户的推文表是 DAYS(或周)的表,然后您将推文放入周表中。现在,当您加载数据时,您可以非常轻松地扫描/跳过一周,同时它具有超强的带宽效率。
粗略的伪代码:
function onTweetSend(tweet){
gun.get('user').get('alice').get('tweets').get(Date.uniqueYear() + Date.uniqueWeek()).set(tweet)
}
function paginateUserTweet(howMany, cb){
var range = convertToArrayOfUniqueWeekNamesFromToday(howMany);
var all = [];
range.forEach(function(week){
gun.get('user').get('alice').get('tweets').get(week).load(function(tweets){
all.push(tweets);
if(all.length < range.length){ return }
all = flattenArray(all);
cb(all);
});
});
}
现在我们可以使用https://gun.eco/docs/RAD#lex
gun.get(...).get({'.': {'>': startkey, '<': endkey}, '%': 50000}).map().once(...)