Ivan Peshev
Ivan Peshev

Reputation: 455

firebase realtime database find node by child value

I have the following structure:

root
  -LKMsdf2_Qxbwtv4238D
     details
       uid: john

  -YKMWrmj_QxbwtvSBM5A
     details
       uid: tony

  -R45Wrmj_Qxbf321BMd4
     details
       uid: karina

How can I find the ref key under 'root' by its uid:

e.g: by uid:karina I need to get the ref key -R45Wrmj_Qxbf321BMd4

is there a way to use some wildcard like /root/{recordid}/details/uid or something?

======== Thanks for the hints! ==== here is my final solution ================

findEntry = function(targetUid) {
var entriesRef = db.ref('root');
return entriesRef.once('value')
    .then((snapshot)=>{
        var id = []; // found id

        snapshot.forEach((childSnapshot)=>{
            var childKey = childSnapshot.key;
            var childData = childSnapshot.val();
            var found = (childData.uid === targetUid);
            if (found) {
                console.log('Found for uid:' + targetUid  + ': ' + childKey);
                id = childKey;
            }
            return found; // true - breaks the forEach, false - continue
        });
    if (!id) {
        console.log('Not Found for uid:' + targetUid);
    }
    return id;
  });

}

Upvotes: 3

Views: 4929

Answers (1)

Mark Bolusmjak
Mark Bolusmjak

Reputation: 24399

No, the best you can do is child (key) search and equality (see the example here https://firebase.google.com/docs/reference/js/firebase.database.Query#equalTo)

// Find all dinosaurs whose height is exactly 25 meters.
var ref = firebase.database().ref("dinosaurs");
ref.orderByChild("height").equalTo(25).on("child_added", function(snapshot) {
  console.log(snapshot.key);
});

There isn't a way to query deeper than that.

You could have other structures for reverse lookups, flatten out your data or solve it in a different way.

Upvotes: 5

Related Questions