我们如何在Firestore数据库中搜索5,000个用户?

时间:2019-02-21 20:36:17

标签: javascript firebase vue.js google-cloud-firestore vuetify.js

我们有一个人员配置应用程序,该应用程序使用vuejs和一个拥有5,000多名用户的Firestore数据库构建。我们面临的挑战是,我们需要管理员的布局来搜索数据库中的用户。

以前,我们是在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数据库中搜索用户有任何想法吗?

2 个答案:

答案 0 :(得分:1)

集成了全文搜索引擎,并使其与Firestore保持同步。实施起来很简单。官方文档推荐Algolia:https://firebase.google.com/docs/firestore/solutions/search

答案 1 :(得分:-1)

正确的答案是全文搜索,但是对于此用例而言,这是一个很大的锤子。以下是一些其他选项,可以让您持续一段时间:

1)首先,请注意,Firestore的索引看起来像

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

如果您具有用户名前缀(例如),则无话可说,您无法对用户> ='a'和用户<='b'进行查询,并且无法获取(此示例){a,aaa,aba}

类似地> ='ab'&& <='b'让您{ab,abc}

因此,您从获取所有5000个用户转移到仅带前缀的用户-这个前缀要小得多。

2)将要自动完成的内容填充到几个文档中并加载它们。

假设您有5000个用户,并且将其名称存储在10个文档中,每个文档具有500个用户名-您可以在添加或删除用户时使这些文档保持最新状态。要获取整个自动完成列表,您需要将这10个文档提取到浏览器中,并将5000个用户喂入某种自动完成窗口小部件。您可以对电子邮件执行相同的操作。

浏览器现在可以执行即时自动完成功能。这比获取5000个用户的整个集合更快/更便宜-您只需要提供所需的数据即可。