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

Android Firebase:获取Mjerenja下latest为true的datum子节点

How to Fetch the Unique "latest" Node and Its "datum" Child

Hey there! Let's figure out how to grab that unique latest node and its datum value from your Firebase Realtime Database structure. First, let's recap your setup to make sure we're on the same page:

Your Database Structure

Mjerenja
  |- [Date Node 1]
  |   |- latest: false
  |   |- datum: "[Corresponding Date]"
  |- [Date Node 2]
  |   |- latest: true  // Only one node has this set to true
  |   |- datum: "[Corresponding Date]"
  |- [Date Node 3]
      |- latest: false
      |- datum: "[Corresponding Date]"

Since you confirmed there's exactly one node with latest: true, we can use a targeted query to find it efficiently. Here's how to do it across common platforms:


Web (Firebase SDK v9 - Modular)

This is the current recommended approach for web apps:

import { getDatabase, ref, query, orderByChild, equalTo, limitToFirst, get } from "firebase/database";

// Initialize database reference
const db = getDatabase();
// Build query: target nodes where `latest` is true, limit to 1 result (since only one exists)
const latestQuery = query(
  ref(db, 'Mjerenja'),
  orderByChild('latest'),
  equalTo(true),
  limitToFirst(1)
);

// Fetch the data once
get(latestQuery)
  .then((snapshot) => {
    if (snapshot.exists()) {
      // The query returns a snapshot containing the single matching node
      snapshot.forEach((childSnapshot) => {
        // Extract the `datum` value
        const datumValue = childSnapshot.child('datum').val();
        console.log('Found latest datum:', datumValue);
        
        // If you need the entire node data, use:
        // const fullNodeData = childSnapshot.val();
      });
    } else {
      console.log('No node with latest: true found!');
    }
  })
  .catch((error) => {
    console.error('Error fetching data:', error);
  });

Web (Firebase SDK v8 - Namespaced)

For older web projects using the legacy SDK:

// Initialize database (assuming Firebase is already configured)
const db = firebase.database();
// Build the same targeted query
const latestQuery = db.ref('Mjerenja')
  .orderByChild('latest')
  .equalTo(true)
  .limitToFirst(1);

// Fetch once
latestQuery.once('value')
  .then((snapshot) => {
    if (snapshot.exists()) {
      snapshot.forEach((child) => {
        const datum = child.child('datum').val();
        console.log('Latest datum:', datum);
      });
    } else {
      console.log('No latest entry exists.');
    }
  })
  .catch((err) => {
    console.error('Error fetching data:', err);
  });

Android (Kotlin)

For Android apps using Kotlin:

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

// Initialize database reference
val database = FirebaseDatabase.getInstance()
val mjerenjaRef = database.getReference("Mjerenja")

// Build the query
val latestQuery = mjerenjaRef
  .orderByChild("latest")
  .equalTo(true)
  .limitToFirst(1)

// Fetch data once
latestQuery.addListenerForSingleValueEvent(object : ValueEventListener {
    override fun onDataChange(snapshot: DataSnapshot) {
        if (snapshot.exists()) {
            // Iterate through the single matching child node
            for (childSnapshot in snapshot.children) {
                val datum = childSnapshot.child("datum").getValue(String::class.java)
                println("Found latest datum: $datum")
                // To get the full node data, use your data class:
                // val mjerenje = childSnapshot.getValue(Mjerenje::class.java)
            }
        } else {
            println("No node with latest: true found")
        }
    }

    override fun onCancelled(error: DatabaseError) {
        println("Error fetching data: ${error.message}")
    }
})

Critical Optimization: Add an Index

To make this query fast (especially as your Mjerenja node grows), add an index in your Firebase Database Rules:

{
  "rules": {
    "Mjerenja": {
      ".indexOn": "latest"
    }
  }
}

Without this index, Firebase will have to scan all Mjerenja nodes to find the matching one, which is inefficient for large datasets.


Key Takeaways

  • Use orderByChild('latest') + equalTo(true) to target the unique node
  • Add limitToFirst(1) to avoid fetching unnecessary data (even though there's only one match)
  • The query returns a snapshot containing the single node, so you'll need to iterate through its children (or use Object.values(snapshot.val())[0] in JS) to access the actual data
  • Always add the index to keep performance snappy

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:36:57