我尝试仅提取仅以用户输入的文本开头的用户名和用户ID。
以下是我的firebase数据库:
如您所见,数据库包含一个包含用户名的用户ID列表。
例如:如果用户在搜索框中输入M,则查询应该 返回Jois先生及其相应的用户ID。
我正在尝试使用javascript执行此操作。以下是我的代码:
function* searchUsers(action) {
const database = firebase.database();
const ref = database.ref('users');
try {
console.log('about to fetch filters users');
const query = ref.orderByChild('username').startAt(action.searchText);
const snapshot = yield call([query, query.once], 'value');
console.log('done fetching users');
console.log(snapshot);
}
catch(error){
console.log(error);
}
}
但我没有得到预期的结果。有人可以告诉我如何查询结果以获得预期的结果吗?
答案 0 :(得分:3)
Firebase数据库查询执行前缀匹配,而不是包含。但是,由于您只指定startAt(...)
,因此查询将匹配名称以前缀开头的所有用户,包括其后的所有名称。如果您只想要以前缀字符串开头的结果,那么您还需要使用endAt(...)
:
const query = ref.orderByChild('username').startAt(action.searchText)endAt(action.searchText+"\uf8ff");
const snapshot = yield call([query, query.once], 'value');
snapshot.forEach(function(child) {
console.log(child.key, child.val().username);
});
答案 1 :(得分:1)
最初,我在考虑equalTo()
查询以及Firebase .indexOn
用户名。
然而,我们真正需要的是一个子串,如ECMAScript 6&#39} String.prototype.startsWith()方法:
.startsWith(inputValue);
所以,我看到用实时数据库做的唯一方法是获取/获取/ .once然后处理客户端,你有更强大的字符串匹配功能。我想下一个问题是如何只提取/获取每个用户密钥的用户名属性。
答案 2 :(得分:0)
要根据第一个字符进行查询,您应该获取该字符并将其传递给+ntfs
函数:
startAt()