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

如何统计Firebase数据库中各Source下的Enonce子节点数量

统计Firebase Realtime Database中各Source下Enonce节点数量的实现方法

JavaScript/Web SDK 实现

首先确保已完成Firebase初始化(替换为你的项目配置):

import { initializeApp } from "firebase/app";
import { getDatabase, ref, onValue } from "firebase/database";

const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  databaseURL: "YOUR_DATABASE_URL",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_SENDER_ID",
  appId: "YOUR_APP_ID"
};

const app = initializeApp(firebaseConfig);
const db = getDatabase(app);

接下来读取所有Source节点并统计Enonce数量:

const sourcesRef = ref(db);

// 监听实时数据变化,若只需一次性统计可改用get()方法
onValue(sourcesRef, (snapshot) => {
  const data = snapshot.val();
  for (const sourceKey in data) {
    if (data.hasOwnProperty(sourceKey) && sourceKey.startsWith("Source ")) {
      const sourceData = data[sourceKey];
      // 统计当前Source下直接子节点中的Enonce数量
      let enonceCount = 0;
      for (const childKey in sourceData) {
        if (childKey === "Enonce") enonceCount++;
      }
      console.log(`${sourceKey} 下的Enonce数量:${enonceCount}`);
    }
  }
}, (error) => {
  console.error("读取数据失败:", error);
});

如果Enonce嵌套在更深层级,使用递归函数统计:

function countEnonceNodes(nodeData) {
  let count = 0;
  for (const key in nodeData) {
    if (key === "Enonce") count++;
    if (typeof nodeData[key] === "object" && nodeData[key] !== null) {
      count += countEnonceNodes(nodeData[key]);
    }
  }
  return count;
}

// 替换之前的统计逻辑
const enonceCount = countEnonceNodes(sourceData);

Android/Kotlin 实现

import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener

val db = FirebaseDatabase.getInstance()
val sourcesRef = db.reference

sourcesRef.addListenerForSingleValueEvent(object : ValueEventListener {
    override fun onDataChange(snapshot: com.google.firebase.database.DataSnapshot) {
        for (sourceSnapshot in snapshot.children) {
            if (sourceSnapshot.key?.startsWith("Source ") == true) {
                // 统计直接子节点中的Enonce数量
                val enonceCount = sourceSnapshot.children.count { it.key == "Enonce" }
                // 嵌套场景改用递归:val enonceCount = countEnonceNodes(sourceSnapshot)
                println("${sourceSnapshot.key} 下的Enonce数量:$enonceCount")
            }
        }
    }

    override fun onCancelled(error: com.google.firebase.database.DatabaseError) {
        println("读取数据失败:${error.message}")
    }
})

// 递归统计嵌套的Enonce节点
fun countEnonceNodes(snapshot: com.google.firebase.database.DataSnapshot): Int {
    var count = 0
    for (childSnapshot in snapshot.children) {
        if (childSnapshot.key == "Enonce") count++
        count += countEnonceNodes(childSnapshot)
    }
    return count
}

关键注意事项

  • 检查Firebase安全规则,确保拥有目标节点的读取权限,否则会触发权限错误。
  • 数据量较大时,避免一次性读取全量数据,可按需读取单个Source节点或使用分页优化性能。
  • 实时统计用持续监听方法,一次性统计用单次读取方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:50:42