Как мы можем искать среди 5000 пользователей в базе данных Firestore? - PullRequest
0 голосов
/ 21 февраля 2019

У нас есть штатное приложение, созданное с использованием vuejs и базы данных firestore с более чем 5000 пользователей.Наша задача состоит в том, что нам нужен макет для администраторов для поиска пользователей в базе данных.

Ранее мы загружали всех пользователей в наш макет Users.vue, а затем искали / просматривали их в таблице данных Vuetify.Проблема в том, что у нас просто слишком много пользователей.Этот макет загружается слишком медленно и даже может привести к сбою приложения в мобильных браузерах.

Решение, которое мы пытаемся сделать, - это поиск пользователей в БД и только загрузка этих результатов в нашу таблицу данных.,Приведенный ниже код (с использованием vuex) работает до тех пор, пока «имя» ТОЧНО.

getUsersState({commit}, payload){
  fb.usersCollection.where("name", "==", payload.search).limit(10).onSnapshot(querySnapshot => {
  let usersArray = []
  console.log(payload.search)
  querySnapshot.forEach(doc => {
    let user = doc.data()
    user.id = doc.id
    usersArray.push(user)
  })
  commit('setUsers', usersArray)
  })
},

Проблема в том, что нам нужно, чтобы он работал, даже если мы вводим только первые несколько букв имениили даже адрес электронной почты.Firestore предлагает только ==,> =, <=,> и <параметры.И «array-contains» работает только с массивом, а не с нашим «пользовательским» объектом. </p>

On Users.vue:

created () {
  console.log('getting users')
  this.$store.dispatch("getUsersState", {search: this.search})
},
computed: {
  ...mapState(['currentUser', 'users', 'userProfile']),
  isAdmin: function() {
    return this.userProfile.accessLevel >= 5
  },
  isUsers: function() {
    return this.users
  }
},
watch: {
  search: 'updateSearch'
},
methods: {
  clearSearch () {
    return this.isSearch = ''
  },
  updateSearch() {
    this.$store.dispatch("getUsersState", {search: this.search})
  },
},

Есть ли у кого-нибудь идеи о том, как мы можем искать впользователи в нашей базе данных Firestore, введя только первые несколько букв их имени?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Правильный ответ - полнотекстовый поиск, но это большой молоток для этого варианта использования.Вот некоторые другие опции, которые могут вас поддерживать некоторое время:

1) Во-первых, обратите внимание, что у Firestore есть индекс, который выглядит как

Collection\User\a   -> somedoc
Collection\User\aaa -> somedoc
Collection\User\aba -> somedoc
Collection\User\abc -> somedoc
Collection\User\bbc -> somedoc

Если у вас есть имя пользователя префикс как a нечего сказать, что вы не можете выполнить запрос для пользователя> = 'a' и пользователя <= 'b' и иметь if fetch (в этом примере) {a, aaa, aba}</p>

Аналогично> = 'ab' && <= 'b' возвращает вас {ab, abc} </p>

Таким образом, вы переходите от выборки всех 5000 пользователей только к пользователям с префиксом -немного меньше.

2) Скомпонуйте вещи, которые вы хотите автозаполнить, в несколько документов и загрузите их.

Представьте, что у вас 5000 пользователей, и вы сохраняете их имена в 10 документах по 500 имен пользователей в каждом.- вы постоянно обновляете эти документы по мере добавления или удаления пользователей.Чтобы получить список весь автозаполнения, вы извлекаете эти 10 документов в браузер и подаете 5000 пользователей в какой-то виджет автозаполнения.Вы можете сделать то же самое для электронной почты.

Браузер теперь может выполнять мгновенное автозаполнение.Это быстрее / дешевле, чем выборка всей коллекции из 5000 пользователей - вы запрашиваете только те данные, которые вам нужны.

0 голосов
/ 21 февраля 2019

Интегрируйте систему полнотекстового поиска и синхронизируйте ее с Firestore.Нетривиально для реализации.Официальные документы рекомендуют Алголию: https://firebase.google.com/docs/firestore/solutions/search

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...