如何使用位置作为密钥将用户存储在firebase数据库中?

时间:2017-10-18 20:52:27

标签: firebase firebase-realtime-database

假设每个用户除了其他凭据(如电子邮件等)外,还有一个位置(十进制度格式的纬度和经度)。

我将每个用户的帐户信息保存在数据库的users表中,如下所示:

enter image description here

字符串" W9ulK6s ......"是用户的uid,点击+后,您会看到有关此用户的详细信息

由于用户可以看到地理位置靠近他/她的其他用户,我想我应该将每个用户的另一个副本保存在名为users_location的表中,这样,我可以根据用户的位置过滤用户必须遍历数据库中的每个用户。

但是,我不知道此时应该做些什么,firebase不允许密钥包含.,因此,我不能使用纬度或经度作为密钥,例如,我不能做这样的事情:假设当前用户的位置是(40.1234566,-80.1234567),纬度和经度

    users_location
        40.1234567    // this path contains ".", which is not allowed
            -80.1234567 // neither is this path
                W9ulK6sUXnVq6VVOlSWhRoVjS6t2
                    email: "stack@overflow.com"
                    photoURL: "https://stackoverflow.com"
                    ... // Other credentials

那么,这个users_location的结构应该是什么样的,以便我仍然可以按位置过滤用户?

1 个答案:

答案 0 :(得分:1)

考虑到你的小数位数,两个坐标完全相同的可能性很小。正确的方法是简单地存储用户,为用户提供其密钥中的位置。

users
   W9ulK6sUXnVq6VVOlSWhRoVjS6t2
   email: "stack@overflow.com"
   photoURL: "https://stackoverflow.com"
   latitude: 40.1234567,
   longitude: -80.1234567,
   ... // Other credentials

然后我会在这条路径上做一个类似的查询。唯一的困难是你不能同时查询,你必须通过一个或另一个查询然后通过查询客户端来找出你真正需要的东西。

ref.child('users').orderByChild('latitude').equalTo(40.1234567);
....
results = data.filter((item) => { item.longitude === -80.1234567});

当您想要通过多个字段进行查询时,Firebase无法正常运行。但是,新的Firestore允许您查询多个内容,但该产品目前处于测试阶段。