[Firebase] - Query arrays data in Firebase?

Nội dung bài viết

Trước đây tôi cũng có viết một bài về đề tài này nhưng có một số trang mạng đã vô tình lấy nó với nhan đề "[Firebase] - Làm thế nào query một array key ở Firebase?". Những ai lấy bài thì cố gắng ghi nguồn lại giúp tôi. Và tôi đã xoá bài đó trong page anonystick này. Nay tôi viết lại và làm rõ một số vấn đề về firebase hơn. 

Trong bài viết này tôi sẽ giới thiệu một vài thủ thuật nho nhỏ trong query arrays in firebase. Chắc hẳn những ai đã và đang sử dụng firebase thì chí ít cũng nhận ra những ưu điểm của nó. Cũng phải thôi Google mua lại mà làm sao mà không mạnh và dại gì mà không dùng cơ chứ khi mà nó free trong mức cho phép.

 Firebase là gì?  Kính mời các devjs lướt qua page này để tìm hiểu https://howtofirebase.com/what-is-firebase-fcb8614ba442. 

Có nhiều bài giới thiệu nhưng tôi thấy bài trên là nói rõ hơn về tính năng của firebase. 

Lướt qua một số ưu điểm chủ chốt một chút:

- Khi xây dựng một project về realtime thì khỏi bàn. Nhanh gọn lẹ, firebase cung cấp nhiều chức năng như phân tích, database.
- Hỗ trợ realtime một cách triệt để có thể bỏ socket.io khi đã dùng firebase với cơ chế pooling.
- Cơ sở hạ tầng có sẵn đầy đủ nếu bạn thật sự đầu tư vào firebase của google.
- Bảo mật khi dùng firebase, phân quyền rõ ràng, ai được edit, ai được đọc...
- Giá thành vừa phải có thể nói là rẻ
- À mà thôi, ưu thì nói làm gì...

Giờ nhược nè, những ai mà trải qua firebase tôi cá sẽ gặp một trong những trường hợp như tôi điển hình là query với một array. 

Firebase không hề support với query array, điều đó tôi thấy đó là một nhược điểm lớn mà hầu như Database nào cũng có thể làm một cách dễ dàng. Mà tại sao firebase lại không support vì sao? Thôi đi vào ví dụ : Tôi có một data firebase như dưới:

"users": {
    "u1": [some data],
    "u2": [some data],
    ...hundreds more,
    "u101": [some data],
    "u102": [some data
}

Nếu truy vấn từng id thì quá đơn giản và điều này quá nhàm chán

databaseRef
  .child('users')
  .child('u1')
  .on('value', snapshot => snapshot.val()) //=> get info U1
 

Nhưng nếu có trường hợp muốn truy vấn khoảng 5 id như thế này: ['u1', 'u2', 'u3', 'u4', 'u5'] Thì làm sao..Đáng lẽ ra firebase phải cung cấp cho chúng ta một phương thức dạng thế này. Tôi sẽ gửi đơn lên, các bạn yên tâm :D

databaseRef
  .child('users')
  .children(["u1", "u2", '''])
  .on('value', snapshot => snapshot.val())
 

Các bạn cũng thấy đó thật là hoàn hảo cho một đoạn code. Vậy nếu firebase không support những ý định như trên thì các bạn sẽ làm thế nào? Suy nghĩ à chúng ta dùng for cho arrays này : ['u1', 'u2', 'u3', 'u4', 'u5'] 

Quá nhục, bách nhục, nếu dùng for thì tôi nghĩ đó là cách đường cùng mà những người không chịu suy nghĩ mới áp dụng. Có nhiều cách để thực hiện và query nhưng tôi không biết cách của tôi đã tối ưu và tường minh chưa.

 Nhưng nếu bạn nào vẫn chưa có cách nào khác và vô tình lướt qua đây thì tạm thời sẽ dùng thế này:

const usersToFetch = ['u1', 'u2', 'u3', 'u4', 'u5']

// Map the Firebase promises into an array
const userPromises = usersToFetch.map(id => {
  return databaseRef.child('users').child(id).on('value', s => s)
})
// Wait for all the async requests mapped into 
// the array to complete
Promise.all(userPromises)
  .then(users => {
    // chúng ta sẽ làm việc tại đây.
  })
  .catch(err => {
    // handle error
  })

Có thể bài viết này dành cho những devjs mà có kinh nghiệm xử lý firebase và es6.

 Chứ bạn nào mà chưa hiểu về firebase thì cũng khó lòng tiếp thu về bài học này. Làm thế nào để query array trong firebase? Và tôi cũng đã trả lời và đưa ra phương pháp cho dù chưa được hoàn mỹ nhưng cũng tạm ổn khi chưa tìm ra một phương pháp nào hay hơn. 

Thân ái!

Top bài viết