Get the child object of a limit(1) query on firebase database - javascript

I have this data
I do this query
firebase.database().ref(${path}/buy)
.orderByChild('price').limitToFirst(1)
.once('value')
.then(snapshot => console.log(snapshot.val()))
And I get this result
Then the question is
Is there an easy way to access the price attribute of the one object whose key I don't know?
e.g. snapshot.first().price or snapshot.only().price
Simply put, I want to avoid this
var result = snapshot.val()
var key = Object.keys(result)[0]
var price = result[key].price

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.
In your callback you need to handle this list by using snapshot.forEach():
firebase.database().ref(${path}/buy)
.orderByChild('price').limitToFirst(1)
.once('value')
.then(snapshot => {
snapshot.forEach(function(child) {
console.log(child.val());
console.log(child.val().price);
})
})

Related

How to delete parent key by its value in firebase using javascript

So I'm a newbie in using firebase real time database and I can't delete products key child with id specified.
I've tried this approach but it didn't yield any success:
removeProductById = async (id, user) => {
const userProductRef = db.ref(`products/product`);
try{
var query = userProductRef.orderByChild('id').equalTo(id);
query.remove()
})
}catch(error){
console.log(`The error has occured ${error.message}`)
}
}
So I wanna know how can one delete any tipe of key by whatever value they specify. Thank you in advance, you have always helped me guys.
There are two problems here:
Your query doesn't match the nodes you want delete.
Firebase doesn't support delete-queries.
Your query doesn't match the nodes you want delete
Your query starts at a node products/product, which doesn't exist in your database, and then orders/filters the id property of each child node.
What you want instead is to start at the products node, and then order/filter on its product/id property of each child node:
In code:
const userProductRef = db.ref(`products`);
var query = userProductRef.orderByChild('product/id').equalTo(id);
Don't forget that you'll need to define an index for product/id for this on the products level in your rules.
Firebase doesn't support delete-queries
You can't simply pass the query and delete instruction to Firebase. To write a node in the database, you'll need to know the entire path to that node.
So you'll need to:
Execute the a query.
Loop over the results in your application code.
Delete each matching node individually or in a multi-path update.
With the query above, that'd be:
query.once("value").then((snapshot) => {
snapshot.forEach((child) => {
child.ref.remove();
});
})
Or with a multi-path/batch update:
query.once("value").then((snapshot) => {
let updates = {};
snapshot.forEach((child) => {
updates[child.key] = null;
});
ref.update(updates);
})

Conditinal database record delete firebase

I want to clean some records of a firestore database. I have a function that receives the records I would like to keep, I check in all the records if id is not in the docsToKeep:firebase documents argument.
I use a foreach for all the records, and I user filter to find the matching id as shown in the working snippet below:
async function checkForNotifClean(docsToKeep:firebase.firestore.QuerySnapshot<firebase.firestore.DocumentData>) {
const db = firebase.firestore();
const notifCollection = db.collection('notifications')
const allData = await notifCollection.get();
allData.docs.forEach(doc => {
const filtered = docsToKeep.docs.filter(entry => entry.id === doc.id);
const needsErase = filtered.length === 0;
if (needsErase) {
const id = doc.id;
notifCollection.doc(id).delete();
}
})
}
Is there a cleaner way to erase all the documents that are not in docsToKeep ? Would be kind of function that get all the objects that are not in both arrays and delete those. I would be happy on improvements on the javascript side to filter out the records to delete, and in the firebase side, improvements regarding the chance of deleting some set of records at once instead of looping through all and deleting each.
To delete (or write to) a document in Firestore you need to know the complete path to that document, including its document ID. If you don't have the IDs of the documents to delete, then your only option is to determine those IDs as you're doing now.
It does lead to the question how docsToKeep is populated though. My guess it that the user already selects some documents from a full list. If that's the case, might you be able to pass the inverted list: docsToDelete?

Reactnative: Query and Filter Firestore Database and save a single returned document field value in a const/var

I have setup a Firebase Firestore Database and would like to filter it for a certain field value in a document.
I have a collection called "PRD" with thousands of documents where all contain the same fields. One of these fields a Document contains is a GTIN Number (String). I am receiving this Number from a Bar Code (called data), and would like to retrieve the Medication Name (called DSCRD, a different Field in all these Documents) using the GTIN Number scanned.
I am having difficulties with retrieving the Value from the Firebase and the documentation doesn't seem to get me any further. I have tried various retrieval methods. At the moment the code for retrieval looks like this:
import { dbh } from "../firebase/config"
import firestore from '#react-native-firebase/firestore'
dbh.collection('PRD')
.where('GTIN', '==', data)
.get()
.then(documentSnapshot => {
console.log('MedData',documentSnapshot.data())
});
I am unsure how to filter the right medicament using the GTIN provided by the Barcode scanner and then save the specific field value for the description of this medicament to a variable.
Firebase is setup correctly since I am able to write whole collections and documents in it.
Here is the database structure, as you can see there is the PRD Collection with all the medicaments and every medicament containing the GTIN and DSCRD Fields:
The problem with your implementation is that you are trying to call documentSnapshot.data() after querying a collection. This is the syntax you would use if you were fetching a single document. Your current query will return a list of documents which you need to handle like this:
.then(querySnapshot => {
querySnapshot.forEach(doc => {
console.log('MedData', doc.data())
})
});
Assuming that the GTIN will fetch one unique document (will it?) then you can just use the only document returned by the query to get the name of the Medication like this:
var medName
dbh.collection('PRD')
.where('GTIN', '==', data)
.get()
.then(querySnapshot => {
querySnapshot.forEach(doc => {
console.log('MedData', doc.data())
medName = doc.data().DSCRD
})
});

Saving a field from firestore that is an array

I am currently working on a mobile app on React and I am having trouble understanding how to save a field from fire store that is an array.
Since I can't post images my database structure is all strings such as username, first name, etc but I have a field called follow list that is an array.
What I want to do is save the usernames from the following list into an array to later search fire store for the username's in the array, this is basically what I want to do so I can render my app's social Feed. I do know that I can probably create another subcollection and write something familiar to what I did to search for users but that was a QuerySnapShot which was overall documents not a specific one and I also know firebase creates an ID for arrays and it increases as the array gets bigger.
I do not want to end up making two more subcollections one for followers and following which I think not ideal right? My current approach is this
export const fetchUserFollowing = async (username) => {
const ref = firebase.firestore().collection('users').doc(username)
let results = []
ref
.get()
.then( doc => {
let data = doc.data()
results = data
})
.catch((err) => {
return 'an error has occurred ', err
})
}
From what I understand is that a DocumentSnapShot .get() function returns an object but what I want is to store follow list into results and then return that but I am not sure how to manipulate the object return to just give me follow List which is an array
https://rnfirebase.io/docs/v5.x.x/firestore/reference/DocumentSnapshot
link to docs

How to combine document id and values in firestore

I am fetching data from firestore and displaying those data's in a list.But the response which i am getting from firestore contains the document id separately and values separately. At the time of fetching itself i am combining it in a array. I would like to know whether it is the correct way of doing or is there any way we can do it better to combine the document id and values together.
Steps which i have done for combining:
db.getEmployees().then((snapshot) => {
let employee = [];
snapshot.docs.forEach((doc) => {
let user = doc.data();
user.id = doc.id;
employee.push(user);
});
dispatch(employeeUpdateSuccess(employee));
According to the documentation for a DocumentSnapshot, there is no way to get the data and the id in a combined way (i.e. with only one method or via one property). In other words, you will always have to use the two following lines of code:
... = doc.data();
... = doc.id;

Categories

Resources