Как запустить запрос Firestore из определенного номера документа без использования OFFSET? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть коллекция Firestore с именем 'users' и много документов по имени каждого пользователя.

Я хочу получить список из 25 пользователей за раз в алфавитном порядке, и вот что я пробовал:

const allUsersRef = admin.firestore().collection('users').orderBy('name').offset(0).limit(25)      
  allUsersRef.get().then((top25Users) => {
    let usersList = '``` << Users LIST >>\n'
    if (!top25Users.empty) {
      top25Users.forEach(eachUser => { 
        usersList = usersList + `\n${eachUser.data().name} \n${eachUser.data().id}`  
      })
      
      console.log(usersList) 
      return 
    } else {
      message.channel.send('Looks like we have no users at the moment!')
      return  
    }
  }).catch((error) => {
    console.log(error)
    return 
  })

Таким образом я легко могу попасть в 25 лучших пользователей! Но что, если я хочу следующие 25? Это Discord Bot, а не приложение Android, в котором я могу добавить кнопку [просмотреть больше], а затем продолжить результаты query.start(), как показано в этом видео firebase

Я могу используйте OFFSET, но количество пользователей велико, поэтому использование offset(500) будет не по карману: '(

Также мне нужно выбирать пользователей в алфавитном порядке, и когда новые пользователи регистрируются, порядок меняется.

TL, DR: Если бы у меня был список моих пользователей в алфавитном порядке, как мне получить пользователей со 126-й позиции до 150-й позиции в списке, что является своего рода страницей 5 для моего запроса 25 на страницу! И без с использованием смещения, потому что это просто использует больше ресурсов!

Сначала это было в базе данных firebase в реальном времени, но затем мне потребовались более сложные запросы, поэтому я перешел сюда:)

Database Struture: Just a single collection named USERS and documents named as username in it.

PS:

const startAtRes = await db.collection('cities')
  .orderBy('population')
  .startAt(1000000)
  .get();

Использование чего-то вроде этого ^ из документации Firebase невозможно, потому что я не буду знать, с чего начать. По мере того как список меняется, как новые пользователи Зарегистрируйтесь!

1 Ответ

1 голос
/ 14 июля 2020

Firestore не поддерживает эффективную разбивку на страницы на основе смещения. Когда вы используете offset(), вы платите за чтение всех документов до этого момента. Единственная доступная эффективная разбивка на страницы требует, чтобы вы предоставили документ привязки или свойства документа привязки для перехода между страницами, как описано в документации .

...