Truy xuất dữ liệu

Đọc dữ liệu bằng GET

Chúng ta có thể đọc dữ liệu từ cơ sở dữ liệu Firebase bằng cách gửi một yêu cầu GET cho URL của cơ sở dữ liệu đó điểm cuối. Hãy tiếp tục với ví dụ về blog của chúng tôi ở phần trước và đọc tất cả dữ liệu bài đăng trên blog:

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'

Yêu cầu thành công sẽ được biểu thị bằng mã trạng thái HTTP 200 OK và sẽ chứa dữ liệu mà chúng tôi đang truy xuất.

Thêm tham số URI

API REST chấp nhận một số tham số truy vấn khi đọc dữ liệu từ cơ sở dữ liệu Firebase của chúng tôi. Dưới đây là các thông số thường dùng nhất. Để xem danh sách đầy đủ, hãy tham khảo Tài liệu tham khảo API REST.

xác thực

Tham số yêu cầu auth cho phép truy cập vào dữ liệu được bảo vệ bằng Quy tắc bảo mật cơ sở dữ liệu theo thời gian thực của Firebase và là được tất cả các loại yêu cầu hỗ trợ. Đối số có thể là mã bí mật của ứng dụng Firebase hoặc mã xác thực, như mô tả trong bài viết Người dùng trong các dự án Firebase. Trong ví dụ sau, chúng ta gửi yêu cầu GET với auth tham số, trong đó CREDENTIAL là mã bí mật của ứng dụng Firebase hoặc mã thông báo xác thực:

curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'

in

Việc chỉ định print=pretty sẽ trả về dữ liệu ở định dạng mà con người có thể đọc được.

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'

Việc chỉ định print=silent sẽ trả về 204 No Content khi thành công.

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'

số gọi lại

Để thực hiện lệnh gọi REST từ một trình duyệt web trên nhiều miền, bạn có thể sử dụng JSONP để gói phản hồi trong một JavaScript hàm callback. Thêm callback= để API REST gói dữ liệu được trả về trong hàm callback mà bạn chỉ định. Ví dụ:

<script>
  function gotData(data) {
    console.log(data);
  }
</script>
<script src="https://docs-examples.firebaseio.com/fireblog/posts.json?callback=gotData">

nông

Đây là một tính năng nâng cao, được thiết kế để giúp bạn làm việc với các tập dữ liệu lớn mà không cần tải xuống mọi thứ. Để sử dụng hàm này, hãy thêm shallow=true làm tham số. Việc này sẽ hạn chế chiều sâu của dữ liệu được trả về. Nếu dữ liệu tại vị trí là dữ liệu gốc JSON (chuỗi, số, hoặc boolean), thì giá trị của nó sẽ được trả về. Nếu thông tin tổng quan nhanh về dữ liệu tại vị trí này là tệp JSON thì giá trị cho mỗi khóa sẽ được cắt ngắn thành true. Ví dụ: sử dụng dữ liệu dưới đây:

{
  "message": {
    "user": {
      "name": "Chris"
    },
    "body": "Hello!"
  }
}

// A request to /message.json?shallow=true
// would return the following:
{
  "user": true,
  "body": true
}

// A request to /message/body.json?shallow=true
// would simply return:
"Hello!"

Hãy thử thực hiện với yêu cầu curl này:

curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'

tạm ngừng

Sử dụng tính năng này để giới hạn thời gian đọc ở phía máy chủ. Nếu một lượt đọc không kết thúc trong thời gian quy định mà sẽ chấm dứt bằng một HTTP Lỗi 400. Điều này đặc biệt hữu ích khi bạn muốn chuyển một lượng dữ liệu nhỏ và không muốn đợi quá lâu để tìm nạp cây con có khả năng rất lớn. Thực tế thời gian đọc có thể khác nhau tuỳ theo kích thước dữ liệu và bộ nhớ đệm.

Hãy chỉ định timeouts bằng định dạng sau: 3ms, 3s hoặc 3min, kèm theo số và đơn vị. Nếu không đã chỉ định, timeout tối đa của 15min sẽ là áp dụng. Nếu timeout không dương hoặc vượt quá giá trị tối đa, yêu cầu sẽ bị từ chối kèm theo lỗi HTTP 400. Trong ví dụ sau, yêu cầu GET bao gồm một timeout/10 giây.

curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?timeout=10s'

Lọc dữ liệu

Chúng ta có thể tạo các truy vấn để lọc dữ liệu dựa trên nhiều yếu tố. Để bắt đầu, bạn chỉ định cách bạn muốn lọc dữ liệu bằng orderBy . Sau đó, bạn kết hợp orderBy với bất kỳ tham số nào trong số 5 tham số khác: limitToFirst, limitToLast, startAt, endAt, và equalTo.

Vì tất cả chúng tôi tại Firebase đều nghĩ rằng khủng long khá thú vị, nên chúng tôi sẽ sử dụng một đoạn trích từ cơ sở dữ liệu mẫu về khủng long để minh hoạ cách bạn có thể lọc dữ liệu:

{
  "lambeosaurus": {
    "height": 2.1,
    "length": 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height": 4,
    "length": 9,
    "weight": 2500
  }
}

Chúng ta có thể lọc dữ liệu theo một trong 3 cách: theo khoá con, theo khoá hoặc theo giá trị. Truy vấn bắt đầu bằng một trong các tham số này và sau đó phải được kết hợp với một hoặc nhiều tham số sau: startAt, endAt, limitToFirst, limitToLast hoặc equalTo.

Lọc theo khoá con được chỉ định

Chúng ta có thể lọc các nút theo một khoá con chung bằng cách truyền khoá đó đến orderBy . Ví dụ: để truy xuất tất cả các con khủng long có chiều cao lớn hơn 3, chúng ta có thể làm như sau:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

Bất kỳ nút nào không có khoá con mà chúng ta đang lọc sẽ được sắp xếp với giá trị là null. Để biết chi tiết về cách dữ liệu theo thứ tự, hãy xem mục Cách sắp xếp dữ liệu.

Firebase cũng hỗ trợ các truy vấn được sắp xếp theo thứ tự của các phần tử con được lồng sâu, thay vì chỉ các truy vấn con ở dưới một cấp. Điều này rất hữu ích nếu bạn có dữ liệu được lồng sâu như sau:

{
  "lambeosaurus": {
    "dimensions": {
      "height" : 2.1,
      "length" : 12.5,
      "weight": 5000
    }
  },
  "stegosaurus": {
    "dimensions": {
      "height" : 4,
      "length" : 9,
      "weight" : 2500
    }
  }
}

Để truy vấn độ cao ngay bây giờ, chúng ta sử dụng đường dẫn đầy đủ đến đối tượng thay vì một khoá duy nhất:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="dimensions/height"&startAt=3&print=pretty'

Mỗi lần, bạn chỉ có thể lọc các truy vấn theo một khoá. Sử dụng nhiều tham số orderBy cùng một yêu cầu sẽ tạo ra lỗi.

Lọc theo phím

Chúng ta cũng có thể lọc các nút theo khoá của chúng bằng cách sử dụng tham số orderBy="$key". Chiến lược phát hành đĩa đơn ví dụ sau truy xuất tất cả khủng long có tên bắt đầu bằng chữ cái a đến m:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="a"&endAt="m"&print=pretty'

Lọc theo giá trị

Chúng ta có thể lọc các nút theo giá trị của khoá con bằng cách sử dụng orderBy="$value" . Giả sử khủng long đang có một cuộc thi thể thao khủng long và chúng ta đang theo dõi điểm số của họ theo định dạng sau:

{
  "scores": {
    "bruhathkayosaurus": 55,
    "lambeosaurus": 21,
    "linhenykus": 80,
    "pterodactyl": 93,
    "stegosaurus": 5,
    "triceratops": 22
  }
}

Để truy xuất tất cả khủng long có điểm số cao hơn 50, chúng ta có thể đưa ra yêu cầu sau:

curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'

Xem mục Cách dữ liệu được sắp xếp để xem nội dung giải thích về cách sắp xếp các giá trị null, boolean, chuỗi và đối tượng khi sử dụng orderBy="$value".

Lọc phức tạp

Chúng ta có thể kết hợp nhiều tham số để tạo các truy vấn phức tạp hơn.

Giới hạn truy vấn

Các tham số limitToFirstlimitToLast được dùng để đặt giá trị số lượng phần tử con tối đa cần nhận dữ liệu. Nếu đặt giới hạn là 100, chúng tôi sẽ chỉ nhận được tối đa 100 nhà xuất bản con phù hợp. Nếu chúng tôi có ít hơn 100 thông báo trong cơ sở dữ liệu khác, chúng tôi sẽ nhận mọi phần tử con. Tuy nhiên, nếu có trên 100 thông báo, chúng tôi sẽ chỉ nhận dữ liệu cho 100 thư trong số các thư đó. Đây sẽ là 100 tin nhắn được sắp xếp đầu tiên nếu chúng tôi bằng cách sử dụng limitToFirst hoặc 100 thông báo được sắp xếp gần đây nhất nếu chúng tôi đang sử dụng limitToLast.

Dựa trên cơ sở dữ liệu về khủng long và orderBy, chúng tôi có thể tìm thấy hai kết quả này khủng long nặng nhất:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="weight"&limitToLast=2&print=pretty'

Tương tự, chúng ta có thể tìm thấy hai con khủng long ngắn nhất bằng cách sử dụng limitToFirst:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'

Chúng tôi cũng có thể giới hạn truy vấn bằng orderBy="$value". Nếu chúng ta muốn tạo một có ba đối thủ cạnh tranh thể thao khủng long có điểm số cao nhất, chúng ta có thể làm được sau:

curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&limitToLast=3&print=pretty'

Truy vấn theo phạm vi

Khi sử dụng startAt, endAtequalTo, chúng ta có thể chọn điểm bắt đầu và điểm kết thúc tuỳ ý cho truy vấn của chúng tôi. Ví dụ: nếu chúng tôi muốn tìm tất cả khủng long cao ít nhất 3 mét, chúng ta có thể kết hợp orderBystartAt:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

Chúng ta có thể dùng endAt để tìm tất cả khủng long có tên trước Pterodactyl về từ điển học:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&endAt="pterodactyl"&print=pretty'

Chúng ta có thể kết hợp startAtendAt để giới hạn cả hai đầu của truy vấn. Ví dụ sau đây tìm tất cả các con khủng long có tên bắt đầu bằng chữ cái "b":

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="b"&endAt="b\uf8ff"&print=pretty'

Truy vấn phạm vi cũng hữu ích khi bạn cần phân trang dữ liệu của mình.

Đang kết hợp

Chúng ta có thể kết hợp tất cả các kỹ thuật này để tạo truy vấn phức tạp. Ví dụ: có thể bạn muốn để tìm tên của tất cả các loài khủng long có chiều cao thấp hơn hoặc bằng chiều cao mà chúng tôi yêu thích tử tế, Stegosaurus:

MY_FAV_DINO_HEIGHT=`curl "https://dinosaur-facts.firebaseio.com/dinosaurs/stegosaurus/height.json"`
curl "https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy=\"height\"&endAt=${MY_FAV_DINO_HEIGHT}&print=pretty"

Cách sắp xếp dữ liệu

Phần này giải thích cách dữ liệu của bạn được sắp xếp khi sử dụng từng thông số trong số 3 thông số lọc.

orderBy (Đơn đặt hàng)

Khi sử dụng orderBy với tên của khoá con, dữ liệu chứa khoá con sẽ được sắp xếp như sau:

  1. Các phần tử con có giá trị null cho khoá con được chỉ định sẽ xuất hiện trước.
  2. Phần tử con có giá trị false cho khoá con được chỉ định sẽ xuất hiện tiếp theo. Nếu nhiều phần tử con có giá trị là false, các phần tử này được sắp xếp từ điển học bằng phím.
  3. Phần tử con có giá trị true cho khoá con được chỉ định sẽ xuất hiện tiếp theo. Nếu nhiều phần tử con có giá trị là true, các phần tử con này được sắp xếp theo từ điển theo .
  4. Các phần tử con có giá trị số sẽ xuất hiện tiếp theo, được sắp xếp theo thứ tự tăng dần. Nếu có nhiều trẻ có cùng giá trị số cho nút con được chỉ định, các nút này được sắp xếp theo khoá.
  5. Chuỗi đứng sau số và được sắp xếp theo từ điển theo thứ tự tăng dần. Nếu có nhiều nút con có cùng giá trị cho nút con được chỉ định, chúng được sắp xếp theo thứ tự ký tự từ điển theo phím.
  6. Các đối tượng đứng sau cùng và được sắp xếp theo từ điển theo khoá theo thứ tự tăng dần.
Kết quả đã lọc được trả về không theo thứ tự. Nếu thứ tự dữ liệu quan trọng, bạn nên sắp xếp kết quả trong ứng dụng sau khi chúng được Firebase trả về.

orderBy="$key"

Khi sử dụng tham số orderBy="$key" để sắp xếp dữ liệu, dữ liệu sẽ được trả về theo thứ tự tăng dần theo khoá như sau. Xin lưu ý rằng khoá chỉ có thể là chuỗi.

  1. Phần tử con có khoá có thể được phân tích cú pháp dưới dạng số nguyên 32 bit sẽ đứng trước và được sắp xếp theo thứ tự tăng dần đơn đặt hàng.
  2. Phần tử con có giá trị chuỗi là khoá tiếp theo, được sắp xếp theo từ điển theo thứ tự tăng dần đơn đặt hàng.

orderBy="$value"

Khi bạn sử dụng tham số orderBy="$value" để sắp xếp dữ liệu, phần tử con sẽ được sắp xếp theo giá trị của chúng. Tiêu chí sắp xếp giống như dữ liệu được sắp xếp theo khoá con, ngoại trừ giá trị của nút sẽ được dùng thay cho giá trị của khoá con đã chỉ định.

thứ tựBy="$mức độ ưu tiên"

Khi sử dụng tham số orderBy="$priority" để sắp xếp dữ liệu, thứ tự của phần tử con được xác định theo mức độ ưu tiên và khoá như sau. Lưu ý rằng các giá trị ưu tiên chỉ có thể là số hoặc chuỗi.

  1. Trẻ không có mức độ ưu tiên (mặc định) sẽ được ưu tiên.
  2. Những trẻ ưu tiên một con số sẽ ở vị trí tiếp theo. Chúng được sắp xếp theo số lượng theo mức độ ưu tiên, từ nhỏ đến lớn.
  3. Trẻ em có chuỗi ưu tiên sẽ ở vị trí cuối cùng. Chúng được sắp xếp theo từ điển theo mức độ ưu tiên.
  4. Bất cứ khi nào hai phần tử con có cùng mức độ ưu tiên (kể cả không có mức độ ưu tiên), chúng sẽ được sắp xếp theo khoá. Các khoá số có trước (được sắp xếp theo số), kế đến là các khoá còn lại (được sắp xếp theo số) từ điển học).

Để biết thêm thông tin về mức độ ưu tiên, xem Tài liệu tham khảo API.

Truyền trực tuyến từ API REST

Điểm cuối REST của Firebase hỗ trợ EventSource / giao thức Sự kiện do máy chủ gửi, giúp dễ dàng phát trực tuyến các thay đổi đến một vị trí trong Cơ sở dữ liệu Firebase.

Để bắt đầu phát trực tiếp, chúng ta cần làm như sau:

  1. Đặt tiêu đề Chấp nhận của ứng dụng thành text/event-stream
  2. Tuân thủ chuyển hướng HTTP, cụ thể là mã trạng thái HTTP 307
  3. Thêm tham số truy vấn auth nếu vị trí cơ sở dữ liệu Firebase yêu cầu quyền đọc

Đổi lại, máy chủ sẽ gửi các sự kiện được đặt tên dưới dạng trạng thái của dữ liệu tại URL được yêu cầu thay đổi. Cấu trúc của các thông báo này phù hợp với giao thức EventSource:

event: event name
data: JSON encoded data payload

Máy chủ có thể gửi những sự kiện sau:

đặt Dữ liệu được mã hoá JSON sẽ là một đối tượng có hai khoá: đường dẫn và dữ liệu
Đường dẫn trỏ đến một vị trí tương ứng với URL yêu cầu
Máy khách cần thay thế tất cả dữ liệu tại vị trí đó trong bộ nhớ đệm bằng dữ liệu đã cung cấp trong thông báo
bản vá Dữ liệu được mã hoá JSON sẽ là một đối tượng có hai khoá: đường dẫn và dữ liệu
Đường dẫn trỏ đến một vị trí tương ứng với URL yêu cầu
Đối với mỗi khoá trong dữ liệu, ứng dụng phải thay thế khoá tương ứng trong bộ nhớ đệm bằng dữ liệu của khoá đó trong thông báo
duy trì hoạt động Dữ liệu cho sự kiện này là rỗng, bạn không cần làm gì cả
hủy Dữ liệu của sự kiện này là rỗng
Sự kiện này sẽ được gửi nếu Quy tắc bảo mật cơ sở dữ liệu theo thời gian thực của Firebase khiến việc đọc dữ liệu tại vị trí đã yêu cầu không còn được cho phép nữa
bị thu hồi xác thực Dữ liệu cho sự kiện này là một chuỗi cho biết một thông tin đăng nhập đã hết hạn
Sự kiện này sẽ được gửi khi thông số xác thực được cung cấp không còn hợp lệ

Dưới đây là ví dụ về một nhóm sự kiện mà máy chủ có thể gửi:

// Set your entire cache to {"a": 1, "b": 2}
event: put
data: {"path": "/", "data": {"a": 1, "b": 2}}


// Put the new data in your cache under the key 'c', so that the complete cache now looks like:
// {"a": 1, "b": 2, "c": {"foo": true, "bar": false}}
event: put
data: {"path": "/c", "data": {"foo": true, "bar": false}}


// For each key in the data, update (or add) the corresponding key in your cache at path /c,
// for a final cache of: {"a": 1, "b": 2, "c": {"foo": 3, "bar": false, "baz": 4}}
event: patch
data: {"path": "/c", "data": {"foo": 3, "baz": 4}}

Nếu bạn đang sử dụng Go, hãy xem Firego, một trình bao bọc của bên thứ ba xoay quanh REST và API truyền trực tuyến của Firebase.