我们有一个人员配置应用程序,该应用程序使用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数据库中搜索用户有任何想法吗?
答案 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个用户的整个集合更快/更便宜-您只需要提供所需的数据即可。