Retrieving Data from Firestore
Once Firestore it initialized, it is possible to retrieve data from the Firestore database. Data can be retrieved by a collection of documents or by one document at a time.
Collection
To retrieve an entire collection, it is best to use the onSnapshot method. While using this method may appear confusing at first, it is ideal because provide real-time updates of the Firestore database.
The onSnapshot method take a callback function, which is call immediately with the current contents of the collection. Then, each time the contents change another call updates the collection snapshot. The forEach method is used to access each document of the collection.
NOTE
The snapshot contains the entire collection each time it is updated. So, to prevent duplications, each document is pushed to an empty array.
In a Vue project, a collection will often be retrieved from inside a lifecycle hook such as created or mounted.
Basic Vue project
In the code below, the 'restaurants' collection is retrieved from the lifecycle hook of the root component using the db variable created during initialization. Each document is added to an empty, temporary array. Then the temporary array is used to replace to value of the restaurants data property.
const app = Vue.createApp({
data: function () {
return { restaurants: [] }
},
created: function () {
db.collection('restaurants')
.onSnapshot(snapshot => {
const data = []
snapshot.forEach(doc => data.push({
id: doc.id,
name: doc.data().name,
city: doc.data().city
}))
this.restaurants = data
})
}
})
Vue CLI project
Using Firestore in a Vue CLI project does not differ much from the basic Vue project. In the code below, begins by importing the db variable from the src/db.js. Then the 'restaurants' collection is retrieved from the lifecycle hook of a single file component. Each document is added to an empty, temporary array. Finally the temporary array is used to replace to value of the restaurants data property.
import db from '../db.js'
export default {
data: function () {
return { restaurants: [] }
},
created: function () {
db.collection('restaurants')
.onSnapshot(snapshot => {
const data = []
snapshot.forEach(doc => data.push({
id: doc.id,
name: doc.data().name,
city: doc.data().city
}))
this.restaurants = data
})
}
}
Document
To retrieve data from a Firestore document, requires first selecting the collection (collection()), then the document (doc()) by its id, and finally using the get() method to make the request. The get() method returns a promise, while the data is being fetch, so the then() method is used to process the data.
Like retrieving a collection, a document will often be retrieved from inside a lifecycle hook such as created or mounted.
Basic Vue project
In the code below, a document of the 'restaurants' collection is retrieved from the lifecycle hook of the restaurant-details component using the db variable created during initialization. The data() method is used to retrieve data from the document.
const app = Vue.createApp({})
app.component('restaurant-details', {
props: ['id'],
data: function () {
return {
name: '',
city: ''
}
},
created: function () {
db.collection('restaurants').doc(this.id).get()
.then(doc => {
if (doc.exists) {
this.name = doc.data().name
this.city = doc.data().city
}
})
}
})
Vue CLI Project
In the code below, begins by importing the db variable from the src/db.js. Then document of the 'restaurants' collection is retrieved from the lifecycle hook of a single file component. The data() method is used to retrieve data from the document.
import db from '../db.js'
export default {
props: ['id'],
data: function () {
return {
name: '',
city: ''
}
},
created: function () {
db.collection('restaurants').doc(this.id).get()
.then(doc => {
if (doc.exists) {
this.name = doc.data().name
this.city = doc.data().city
}
})
}
}