У нас есть штатное приложение, созданное с использованием 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 предлагает только ==,> =, <=,> и <параметры. И «массив-содержащий» работает только с массивом, а не с нашим «пользовательским» объектом.

На 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, просто вводя первые несколько букв их имени?

1
Greg Fielding 21 Фев 2019 в 23:36

2 ответа

Лучший ответ

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

1
Doug Stevenson 21 Фев 2019 в 20:38

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

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

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

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

Точно так же> = 'ab' && <= 'b' получает вас {ab, abc}

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

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

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

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

-1
Joshua Melcon 22 Фев 2019 в 17:32