I have a firebase database from which I would like to retrieve all items except the items having a specific value. A function like notEqualTo(), so to say.
firebase.database()
.ref().child('/snippets/')
.orderByChild('description')
.notEqualTo('dontDisplay')
.on('value',function(snap) {
// Working with the right snapshot
}
This obviously does not work since notEqualTo is not a function. I also tried passing a function to equalTo but this doesn't work either:
firebase.database()
.ref().child('/snippets/')
.orderByChild('description')
.equalTo(function (descr) { descr !== 'dontDisplay'; })
.on('value',function(snap) {
// Working with the right snapshot
}
What's the right way to filter on items not having the description 'dontDisplay'?
Related
I want to toggle a value called 'session' and then, update this value.
i've tried to do session=!session, but that didn't work.
session is a parameter inside a object, this object are displayed on my nosql database, i'm using the realtime database from firebase.
however session:true and session:false works
obs: English isn't my first lenguage, so sorry if I used wrong words.
Since you want to write a value to a path based on its existing value, you'll want to use a transaction.
Something like:
const userRef = ref(db, `/usuários/${fistKey}/session`);
runTransaction(userRef, (session) => {
if (session) {
return !session
}
return true; // 👈 default value
});
I have a list of users in firebase database and I want to make an array of all users whose isDonor value is true. How can I accomplish that?
Something like this should work:
let ref = firebase.database().ref("users");
ref.orderByChild("isDonor").equalTo(true).once("value").then((results) => {
results.forEach((snapshot) => {
console.log(snapshot.key, snapshot.val());
});
});
Also see the Firebase documentation on sorting and filtering data.
I'm trying to get firebase data from a node which uid must start with a passed string.
I tried a code but I always get the same data. The database data is as following:
And I'm using the following code:
var ref = firebase.database().ref("restaurantes/history");
ref.orderByKey().startAt(userUID).once("child_added", function(snapshot) {
snapshot.forEach(child => {
if(child.key == "orders")
{
console.log(child.val());
_.each(child.val(), (value, key) => {
arrtmp.push(value)
})
}
})
If user is "FKQLlqa" I should get the history data shown in the picture. If I user is "abc" I shouldn't get any data. But I always get the data shown in the picture. Should I use another way of querying? Or I should use a key field inside orders and payments data?
Regards!
Try the following:
var ref = firebase.database().ref("restaurantes/history");
ref.child(userUID).once("value", function(snapshot) {
if (snapshot.exists()) {
console.log(snapshot.val());
}
else {
console.log("different user");
});
This will check if the snapshot that contains the userId (added as a parameter in the child() method), already exists in the database then you will be able to retrieve the data under the userId.
For reference:
https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#exists
Peter's answer is the correct solution. I'm merely adding this for completeness.
When you call orderBy... on a Firebase reference, the database orders all child nodes on the key/value/child that you specify.
If you then subsequently call startAt(...) on the query, it finds the (first) node that starts with that value and starts returning all results from there. So if you start at FKQLlqa, it will start returning keys at FKQLlqa and then return all keys after it.
If you want to return the child node(s) with a specific key/value/child, you'd use equalTo(...). So:
ref.orderByKey().equalTo(userUID).once("child_added", function(snapshot) {
...
But as Peter said already, this is just a more expensive way to look up a child with a known key. I highly recommend using his better approach: ref.child(userUID).once("value".
I'm trying to get changes for certain items in my list -- not all items as this is a huge list that could be modified by many people.
const ref = firebase.database()
.ref('images')
.orderByValue('place')
.equalTo('san-francisco')
ref.on('child_changed', data => {
console.log(data)
})
If I take out equalTo it works, but it will get data for every city whereas I'm only concerned about one.
Try using orderByChild instead of orderByValue
No matter what I do I can't seem to figure out a way to access the child "onSite", which shows as being there when I log snapshot.val(), but I cannot figure out how to access it.
Code:
firebase.database().ref().child("users").orderByChild('facebook_id').equalTo(fbID).once("value").then(function(snapshot) {
console.log(snapshot.val());
console.log(snapshot.child("onSite").val());
});
Here is the response:
It shouldn't be null, it should be false. I can't do child("4mUUjF...").child("onSite").val() because I don't know what the ID is before the query. Using an each loop doesn't work, it only loops through the first level, which is the ID.
Use the key of the object
Get the snapshot val and then find the key with the Object.keys method. This will allow you to then get inside the snap. Once there it's a simple matter of accessing the values like any other object.
firebase.database().ref().child("users").orderByChild('facebook_id').equalTo(fbID).once("value").then(function(snapshot) {
let snap = snapshot.val();
let key = Object.keys(snap)[0]
console.log(snap[key].onSite);
})
When you execute a query against the Firebase Database, there will potentially be multiple results. So the snapshot contains a list of those results. Even if there is only a single result, the snapshot will contain a list of one result.
Your code needs to handle the list, by using Snapshot.forEach():
firebase.database().ref().child("users").orderByChild('facebook_id').equalTo(fbID)
.once("value").then(function(result) {
result.forEach(function(snapshot) {
console.log(snapshot.val());
console.log(snapshot.child("onSite").val());
});
});