Как вы делаете пагинацию в GUN?

Как вы делаете что-то вроде gun.get({startkey, endkey})?

Ранее: https://github.com/amark/gun/issues/479

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.

Другая грубая идея заключается в том, что вы моделируете свои данные на основе нумерации страниц или времени. Таким образом, вместо того, чтобы ВСЕ твиты попадали в таблицу твитов пользователя, вместо этого, таблица твитов пользователя - это таблица ДНЕЙ (или недель), а затем вы помещаете твит в недельную таблицу. Теперь, когда вы загружаете данные, вы можете очень легко сканировать / пропускать без выходных, в то время как это обеспечивает высокую пропускную способность.

Грубый код 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);
    });
  });
}

Теперь мы можем использовать https://gun.eco/docs/RAD#lex

      gun.get(...).get({'.': {'>': startkey, '<': endkey}, '%': 50000}).map().once(...)
Другие вопросы по тегам