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

Firebase嵌套子节点按值查询:获取isValid=true的用户及请求列表

获取Firebase中所有isValid=true的用户及请求列表

你的数据结构以用户ID作为父节点,每个用户节点下包含多个请求ID子节点,每个请求节点包含ReqName和isValid字段。以下是基于现有结构的实现方案,提供C# Unity、JavaScript、Java三种代码示例:

C# Unity Firebase SDK 实现

using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;
using UnityEngine;

public class FirebaseRequestHandler : MonoBehaviour
{
    private DatabaseReference _dbRef;

    void Start()
    {
        // 初始化Firebase(替换为你的数据库URL)
        FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://your-project-id.firebaseio.com/");
        _dbRef = FirebaseDatabase.DefaultInstance.RootReference;

        GetValidRequests();
    }

    private void GetValidRequests()
    {
        _dbRef.GetValueAsync().ContinueWith(task =>
        {
            if (task.IsFaulted)
            {
                Debug.LogError("数据获取失败: " + task.Exception);
                return;
            }

            DataSnapshot usersSnapshot = task.Result;
            foreach (DataSnapshot userSnap in usersSnapshot.Children)
            {
                string userId = userSnap.Key;
                // 遍历当前用户下的所有请求
                foreach (DataSnapshot reqSnap in userSnap.Children)
                {
                    bool isValid = reqSnap.Child("isValid").Value as bool? ?? false;
                    if (isValid)
                    {
                        string reqId = reqSnap.Key;
                        string reqName = reqSnap.Child("ReqName").Value as string ?? "未命名";
                        Debug.Log($"有效请求:用户ID={userId},请求ID={reqId},名称={reqName}");
                        // 可将数据存入集合或做后续业务处理
                    }
                }
            }
        });
    }
}

JavaScript(Web)实现

// 初始化Firebase(替换为你的配置)
const firebaseConfig = {
  apiKey: "your-api-key",
  authDomain: "your-project-id.firebaseapp.com",
  databaseURL: "https://your-project-id.firebaseio.com",
  projectId: "your-project-id"
};
firebase.initializeApp(firebaseConfig);
const db = firebase.database();

// 拉取所有有效请求
db.ref().once('value')
  .then(snapshot => {
    snapshot.forEach(userSnap => {
      const userId = userSnap.key;
      userSnap.forEach(reqSnap => {
        const isValid = reqSnap.child('isValid').val();
        if (isValid) {
          const reqId = reqSnap.key;
          const reqName = reqSnap.child('ReqName').val();
          console.log(`有效请求:用户ID=${userId},请求ID=${reqId},名称=${reqName}`);
        }
      });
    });
  })
  .catch(err => console.error('数据获取失败:', err));

Java(Android)实现

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class ValidRequestFetcher {
    private DatabaseReference dbRef;

    public ValidRequestFetcher() {
        dbRef = FirebaseDatabase.getInstance().getReference();
        fetchValidRequests();
    }

    private void fetchValidRequests() {
        dbRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot userSnap : dataSnapshot.getChildren()) {
                    String userId = userSnap.getKey();
                    for (DataSnapshot reqSnap : userSnap.getChildren()) {
                        Boolean isValid = reqSnap.child("isValid").getValue(Boolean.class);
                        if (isValid != null && isValid) {
                            String reqId = reqSnap.getKey();
                            String reqName = reqSnap.child("ReqName").getValue(String.class);
                            System.out.printf("有效请求:用户ID=%s,请求ID=%s,名称=%s%n", userId, reqId, reqName);
                            // 后续业务逻辑处理
                        }
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                System.err.println("数据获取失败: " + databaseError.getMessage());
            }
        });
    }
}

优化建议

如果数据量较大,全量遍历用户节点的效率会偏低。建议新增一个validRequests节点,将所有isValid=true的请求同步存储在这里,结构示例如下:

validRequests
    请求ID1: { userId: "101010", ReqName: "Name" }
    请求ID2: { userId: "xxx", ReqName: "xxx" }

这样可以直接查询validRequests节点,避免遍历所有用户,提升查询效率。

内容的提问来源于stack exchange,提问作者Thudner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:25:18