Javascript Firebase获取所有用户名&;以用户输入的字符开头的用户Id

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(

我正在尝试只获取仅以用户输入的文本开头的用户名和用户ID

以下是我的firebase数据库:

如您所见,数据库包含一个包含用户名的用户ID列表

例如:如果用户在搜索框中输入M,则查询应 返回Mr 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);
    }
}

但我没有得到预期的结果。有人能告诉我如何查询结果以获得预期结果吗?

要基于第一个字符进行查询,您应该获取该字符并将其传递给
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”);
我打印快照时,只获取用户ID
snapshot.forEach(函数(child){console.log(child.key,child.val().username})
感谢它的工作,但它将返回包含搜索字符的所有用户名。我只想返回以字符开头的用户名Firebase数据库查询进行前缀匹配,而不是包含。如果您只想得到以前缀字符串开头的结果,您还需要使用
endAt(…)
。例如,
ref.orderByChild('username').startAt(action.searchText).endAt(action.searchText+“\uf8ff”);
确认如果数据库具有西里尔字符,此操作也有效。确认如果数据库具有西里尔字符,此操作也有效。
.startsWith(inputValue);