Javascript Firebase获取所有用户名&;以用户输入的字符开头的用户Id
我正在尝试只获取仅以用户输入的文本开头的用户名和用户ID 以下是我的firebase数据库: 如您所见,数据库包含一个包含用户名的用户ID列表 例如:如果用户在搜索框中输入M,则查询应 返回Mr Jois及其对应的用户ID。 我正在尝试使用javascript来实现这一点。下面是我的代码:Javascript Firebase获取所有用户名&;以用户输入的字符开头的用户Id,javascript,firebase,react-native,firebase-realtime-database,redux,Javascript,Firebase,React Native,Firebase Realtime Database,Redux,我正在尝试只获取仅以用户输入的文本开头的用户名和用户ID 以下是我的firebase数据库: 如您所见,数据库包含一个包含用户名的用户ID列表 例如:如果用户在搜索框中输入M,则查询应 返回Mr Jois及其对应的用户ID。 我正在尝试使用javascript来实现这一点。下面是我的代码: function* searchUsers(action) { const database = firebase.database(); const ref = database.ref(
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);
}
}
但我没有得到预期的结果。有人能告诉我如何查询结果以获得预期结果吗?要基于第一个字符进行查询,您应该获取该字符并将其传递给
startAt()
函数:
const query = ref.orderByChild('username').startAt(action.searchText.charAt(0));
要基于第一个字符进行查询,应获取该字符并将其传递给
startAt()
函数:
const query = ref.orderByChild('username').startAt(action.searchText.charAt(0));
Firebase数据库查询进行前缀匹配,而不是包含。但是,由于您只指定了
startAt(…)
,因此查询将匹配名称以前缀开头的用户中的所有用户,包括其后面的所有名称。如果只需要以前缀字符串开头的结果,那么还需要使用endAt(…)
:
Firebase数据库查询进行前缀匹配,而不是包含。但是,由于您只指定了
startAt(…)
,因此查询将匹配名称以前缀开头的用户中的所有用户,包括其后面的所有名称。如果只需要以前缀字符串开头的结果,那么还需要使用endAt(…)
:
最初,我考虑的是
equalTo()
查询和Firebase用户名
但是,我们真正需要的是一个类似ECMAScript 6的方法的子字符串:
所以,我认为使用realtime DB实现这一点的唯一方法是获取/fetch/。一旦它处理完,就可以处理客户端,在客户端您可以获得更强大的字符串匹配功能。我想下一个问题是如何仅提取/获取每个用户密钥的username属性。最初,我考虑的是
equalTo()
查询以及Firebase用户名
但是,我们真正需要的是一个类似ECMAScript 6的方法的子字符串:
所以,我认为使用realtime DB实现这一点的唯一方法是获取/fetch/。一旦它处理完,就可以处理客户端,在客户端您可以获得更强大的字符串匹配功能。我猜下一个问题是如何仅提取/获取每个用户密钥的username属性。我打印出快照,只获取userID
snapshot.forEach(函数(child){console.log(child.key,child.val().username})
感谢它的工作,但它将返回包含搜索字符的所有用户名。我只想返回以字符开头的用户名Firebase数据库查询进行前缀匹配,而不是包含。如果您只想得到以前缀字符串开头的结果,您还需要使用endAt(…)
。例如,ref.orderByChild('username').startAt(action.searchText).endAt(action.searchText+“\uf8ff”);
我打印快照时,只获取用户IDsnapshot.forEach(函数(child){console.log(child.key,child.val().username})
感谢它的工作,但它将返回包含搜索字符的所有用户名。我只想返回以字符开头的用户名Firebase数据库查询进行前缀匹配,而不是包含。如果您只想得到以前缀字符串开头的结果,您还需要使用endAt(…)
。例如,ref.orderByChild('username').startAt(action.searchText).endAt(action.searchText+“\uf8ff”);
确认如果数据库具有西里尔字符,此操作也有效。确认如果数据库具有西里尔字符,此操作也有效。
.startsWith(inputValue);