Home > front end >  How do I only return my primary keys from a Firebase RTDB and not the rest of the data stored when u
How do I only return my primary keys from a Firebase RTDB and not the rest of the data stored when u

Time:07-30

My menu item tree looks is shown below:

menuItem
        J1
           -description:"Tasty milk shake!"
           -img:"assets/images/milkshake.JPG"
           -itemName:"Milk Shake"
           -price:20
           -varieties
                    -var1:"Chocolate"
                    -var2:"Vanilla"
                    -var3:"Strawberry"

I want to get just the item IDs (J1, J2, J3 ect.) but not all the information such as 'itemName'

final DatabaseReference _dbRef = FirebaseDatabase.instance.ref();
        final items = await _dbRef.child('menuItem').get();
        if (items.exists) {
          String? itemID = items.value.toString();
        }

items.values returns all the information for an item and items.key returns only 'menuItem'.

How can I just get the IDs only?

CodePudding user response:

With the Realtime Database queries done via the Client SDKs are deep: They always return the entire subtree.

This is a key difference with Firestore for which queries are shallow: They only return documents in a particular collection or collection group and do not return subcollection data.

However, with the Realtime Database REST API you can use a query parameter named shallow, which "limits the depth of the data returned at a location". I've never used it but it seems that it will fulfill your requirement.


Another solution would to denormalise your data and maintain, in parallel to the menu items, a list of menu IDs in a specific DB node.

CodePudding user response:

As Renaud explained in his answer, all read operations in the Firebase Realtime Database SDKs return complete branches of the tree, and can't be used to just read the keys.

That said, you can use just the keys from the data you read with:

final DatabaseReference _dbRef = FirebaseDatabase.instance.ref();

final items = await _dbRef.child('menuItem').get();
items.forEach((child) => {
  console.log(child.key);
})

The above will still retrieve the entire menuItem branch of your database, but only show the keys under that node (so J1 from the sample you shared).

  • Related