You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Firebase 查询用户嵌套好友数组内名称返回空结果问题求助

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:12:47