Unity Firebase 查询用户嵌套好友数组内名称返回空结果问题求助
你的问题出在查询路径和数据结构不匹配上,咱们一步步理清楚:
问题根源
你当前的查询是在Users节点下直接用OrderByChild("name"),但Firebase的查询规则是:OrderByChild会在当前节点的直接子节点中查找指定字段。而你的name字段根本不在User1、User2这些节点里,而是嵌套在每个用户的friends数组的元素中——Firebase没办法直接穿透数组去搜索内部的子字段,所以自然返回空结果。
解决方案
Firebase作为NoSQL数据库,核心思路是根据查询需求设计数据结构,这里分两种场景给你对应方案:
场景1:搜索某个特定用户的好友
如果你只想查询某个用户(比如User1)的好友中匹配搜索词的名称,首先需要把friends从数组改成键值对结构(数组在Firebase里更适合有序列表,不适合查询场景):
调整后的数据结构示例:
Users: User1: friends: friend_id_R: name: "R" friend_id_T: name: "T" User2: friends: friend_id_X: name: "X" friend_id_Y: name: "Y"
这里用好友的唯一ID作为键,内部存储名称等信息。对应的查询代码可以写成:
// 以查询User1的好友为例 Query databaseQuerySlang = Database.RootReference.Child("Users") .Child("User1").Child("friends") .OrderByChild("name").StartAt(_search).EndAt(_search + "\uf8ff");
这样查询会直接在User1的friends节点下,按每个子节点的name字段进行匹配,就能得到正确结果。
场景2:搜索所有用户的所有好友
如果需要跨所有用户搜索匹配的好友名称,你需要额外维护一个反向索引节点,把好友名称和所属用户关联起来:
新增的反向索引结构示例:
FriendNames: R: User1: true T: User1: true X: User2: true Y: User2: true
这个节点的作用是把每个好友名称映射到对应的用户ID。此时查询代码可以写成:
Query databaseQuerySlang = Database.RootReference.Child("FriendNames") .OrderByKey().StartAt(_search).EndAt(_search + "\uf8ff");
查询结果会返回所有匹配的名称,以及对应的用户ID,你可以再根据这些ID去获取详细信息。
小提示
Firebase不支持类似SQL的嵌套WHERE查询,所以在设计数据结构时,一定要提前考虑好你需要的查询场景,把需要查询的字段尽量放在容易访问的层级,或者通过反向索引来优化查询效率。
内容的提问来源于stack exchange,提问作者Thudner

