Javascript 基于Firebase中的一个或多个内部属性查询多个项目
如果标题写得不恰当,我深表歉意。我正在寻求有关在Firebase上执行以下操作的建议方法的建议 我正在使用Firebase作为一种群组协作应用(想想Whatsapp)。用户使用其电话号码注册,并作为用户添加到Firebase数据库。用户存储在Firebase上,如下所示Javascript 基于Firebase中的一个或多个内部属性查询多个项目,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,如果标题写得不恰当,我深表歉意。我正在寻求有关在Firebase上执行以下操作的建议方法的建议 我正在使用Firebase作为一种群组协作应用(想想Whatsapp)。用户使用其电话号码注册,并作为用户添加到Firebase数据库。用户存储在Firebase上,如下所示 users -KGvMIPwul2dUYABCDEF countryCode: 1 id: -KGvMIPwul2dUYABCDEF mobileNumber: 1231231234 name: Va
users
-KGvMIPwul2dUYABCDEF
countryCode: 1
id: -KGvMIPwul2dUYABCDEF
mobileNumber: 1231231234
name: Varun Gupta
每当用户打开应用程序时,我都想检查用户电话联系人列表中的所有联系人是否也在使用我的应用程序,并在应用程序中显示这些联系人。该电话号码用于检查电话联系人中的人是否正在使用该应用程序。为了实现这一点,我将用户联系人列表存储到Firebase,这将触发Firebase函数,以使用我的应用程序计算联系人,并将其单独存储在Firebase上
为了找出谁在使用我的应用程序,我创建了一张Firebase中所有用户的地图,上面键入了电话号码以及国家代码和电话号码的组合。该值是用户ID,对于上面的示例,该ID将是-KGvMIPwul2dUYABCDEF
。因此,映射将为用户提供以下两个条目
{
1231231234: -KGvMIPwul2dUYABCDEF
11231231234: -KGvMIPwul2dUYABCDEF
}
我为所有用户创建上述内容,然后我只查询每个联系人,如果地图中有用户电话号码的条目,并计算出使用该应用程序的用户列表
下面是代码的摘录。现在它是在firebase队列
worker中完成的,但我打算将它移到firebase函数中
// This piece of code is used to read the users in Firebase and create a map as described above
ref.child('users').on('child_added', (snapshot) => {
var uid = snapshot.key;
var userData = snapshot.val();
// Match against both mobileNumber and the combination of countryCode and mobileNumber
// Sanity check
if(userData.mobileNumber && userData.countryCode) {
contactsMap.set(sanitizePhoneNumber(userData.mobileNumber), uid);
contactsMap.set(sanitizePhoneNumber(userData.countryCode + userData.mobileNumber), uid);
}
});
// This piece of code is used to figure out which contacts are using the app
contactsData.forEach((contact) => {
contact.phoneNumbers.forEach((phoneNumber) => {
var contactsMapEntry = contactsMap.get(sanitizePhoneNumber(phoneNumber))
// Don't add user himself to the contacts if he is present in the contacts
if(contactsMapEntry && contactsMapEntry !== uid && !contactsObj[contactsMapEntry]) {
const contactObj = {
name: createContactName(contact),
mobileNumber: phoneNumber.number,
id: contactsMapEntry
}
contactsObj[contactsMapEntry] = contactObj
currentContacts.push(contactObj)
}
});
});
// After figuring out the currentContacts, I do some processing and they are pushed to Firebase which are then synched with the app
我担心的是,随着用户数量的增加,这将开始变得缓慢,因为我正在读取Firebase中的所有用户,为每个请求在内存中创建此地图,以确定使用该应用程序的联系人,或者我是否同意这种蛮力方法,不必太担心
我是否应该考虑下面的复制数据也
contacts
1231231234: -KGvMIPwul2dUYABCDEF
11231231234: -KGvMIPwul2dUYABCDEF
然后只需查询/contacts/{contact phone number}
如果有更好的方法来实现此工作流,请提出建议。与其描述您关心的代码,不如将您的问题编辑到。您好@FrankvanPuffelen我已经添加了用于执行所述操作的代码。是否有什么原因需要执行
firebase.database().ref('users').orderByChild('mobileNumber').equalTo('1234'))
不起作用?@torazaburo它只适用于匹配mobileNumber,但我还想匹配国家代码和手机号码的组合。为此,我认为我应该为用户存储一个国家代码和手机号码的组合条目,并运行类似的查询。谢谢!