你怎么在GUN中做分页?

时间:2018-02-23 17:25:56

标签: gun

你如何做像gun.get({startkey,endkey})这样的事情?

以前:https://github.com/amark/gun/issues/479

1 个答案:

答案 0 :(得分: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(或几周)的表,然后你把推文放在周表中。现在,当您加载数据时,您可以非常轻松地在周期内扫描/跳过,同时提高带宽效率。

粗糙的PSEUDO代码:

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);
    });
  });
}