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
相关产品推荐
相关产品推荐

