Kiểu dữ liệu 'Tham khảo' của Firebase Firestore tốt cho việc gì?


189

Tôi chỉ đang khám phá Firebase Firestore mới và nó chứa một kiểu dữ liệu được gọi reference. Nó không rõ ràng với tôi những gì nó làm.

  • Có giống như khóa ngoại?
  • Nó có thể được sử dụng để chỉ đến một bộ sưu tập được đặt ở một nơi khác không?
  • Nếu referencelà một tài liệu tham khảo thực tế, tôi có thể sử dụng nó cho các truy vấn không? Ví dụ: tôi có thể có một tham chiếu trỏ trực tiếp đến người dùng, thay vì lưu trữ userId trong trường văn bản không? Và tôi có thể sử dụng tài liệu tham khảo người dùng này để truy vấn không?

18
Tôi nghĩ rằng video này từ nhóm firebase phá vỡ nó cho bạn: youtube.com/watch?v=Elg2zDVIcLo (xem từ 4:36)
Adarsh

Câu trả lời:


91

Tài liệu tham khảo rất giống như khóa nước ngoài.

SDK hiện đang phát hành không thể lưu trữ tài liệu tham khảo cho các dự án khác. Trong một dự án, các tài liệu tham khảo có thể trỏ đến bất kỳ tài liệu nào khác trong bất kỳ bộ sưu tập nào khác.

Bạn có thể sử dụng các tham chiếu trong các truy vấn như bất kỳ giá trị nào khác: để lọc, đặt hàng và để phân trang (startAt / startAfter).

Không giống như các khóa ngoại trong cơ sở dữ liệu SQL, các tham chiếu không hữu ích để thực hiện các phép nối trong một truy vấn duy nhất. Bạn có thể sử dụng chúng cho các tra cứu phụ thuộc (có vẻ như tham gia), nhưng hãy cẩn thận vì mỗi bước nhảy sẽ dẫn đến một chuyến đi khứ hồi khác đến máy chủ.


9
Xin vui lòng, bạn có thể chia sẻ trường hợp sử dụng có thể? Có thể truy vấn các trường trong tài liệu tham khảo đó? Ví dụ: tôi có một friendsbộ sưu tập liệt kê tất cả bạn bè của tôi ( friends/myId). Sau đó, tôi tham chiếu tài liệu này trong friendslĩnh vực của một tài liệu khác ( group/groupId). Tôi chỉ muốn hiển thị những người bạn của tôi trong nhóm đó, làm điều gì đó như thế này : where('friends.myId', '==', true).
Sẽ

108
Btw, có thể hữu ích để cập nhật các tài liệu để bao gồm một ví dụ về việc thêm một loại tham chiếu.
Sẽ

11
Tôi không thể tìm thấy bất kỳ thông tin về điều này? Điều này sẽ thay đổi toàn bộ cấu trúc cơ sở dữ liệu của tôi, tôi cần biết thêm ...
Ruben

3
Bạn có một ví dụ (tốt nhất là trong swift) về cách truy vấn bằng tham chiếu không? ngay bây giờ, tôi có thể làm điều đó bằng cách lưu trữ uid thô dưới dạng chuỗi, nhưng điều đó có vẻ không đúng.
Mickey Cheong

6
Tôi cần thay đổi tất cả các loại tham chiếu của mình thành chuỗi vì truy vấn sẽ luôn thất bại với loại tham chiếu. Tôi thực sự không thể tìm thấy bất cứ điều gì về cách truy vấn theo loại tham chiếu :( nếu có ai tìm ra cách truy vấn theo loại tham chiếu cho tôi biết ...
Sam Trent

133

Thêm vào bên dưới những gì làm việc cho tôi bằng cách sử dụng tài liệu tham khảo trong Firestore.

Như các câu trả lời khác nói, nó giống như một khóa ngoại. Thuộc tính tham chiếu không trả về dữ liệu của tài liệu tham chiếu mặc dù. Ví dụ: tôi có một danh sách các sản phẩm, với tham chiếu userRef là một trong những thuộc tính trên sản phẩm. Lấy danh sách các sản phẩm, cho tôi tham khảo của người dùng đã tạo ra sản phẩm đó. Nhưng nó không cho tôi biết chi tiết về người dùng trong tài liệu tham khảo đó. Tôi đã sử dụng back end khác như một dịch vụ với con trỏ trước đó có cờ "popated: true" cung cấp lại chi tiết người dùng thay vì chỉ id tham chiếu của người dùng, điều này sẽ rất tuyệt vời ở đây (hy vọng là một cải tiến trong tương lai ).

Dưới đây là một số mã ví dụ mà tôi đã sử dụng để đặt tham chiếu cũng như lấy bộ sưu tập danh sách sản phẩm sau đó lấy thông tin người dùng từ id tham chiếu người dùng được cung cấp.

Đặt tham chiếu trên bộ sưu tập:

let data = {
  name: 'productName',
  size: 'medium',
  userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);

Nhận bộ sưu tập (sản phẩm) và tất cả tài liệu tham khảo trên mỗi tài liệu (chi tiết người dùng):

db.collection('products').get()
    .then(res => {
      vm.mainListItems = [];
      res.forEach(doc => {
        let newItem = doc.data();
        newItem.id = doc.id;
        if (newItem.userRef) {
          newItem.userRef.get()
          .then(res => { 
            newItem.userData = res.data() 
            vm.mainListItems.push(newItem);
          })
          .catch(err => console.error(err));
        } else {
          vm.mainListItems.push(newItem);  
        }

      });
    })
    .catch(err => { console.error(err) });

Hi vọng điêu nay co ich


3
Cám ơn vì đã chia sẻ! Tôi nghĩ rằng có một lỗi đánh máy trong dòng đầu tiên của Get part và nó nên như vậy db.collection('products').get(). Bạn đã thử nhận người dùng trực tiếp? Tôi đoán là newItem.userRef.get()nên làm việc thay vìdb.collection("users").doc(newItem.userRef.id).get()
Serge Nefedyev

53
Trước hết cảm ơn bạn cho ví dụ. Tôi hy vọng họ sẽ thêm một "dân số: đúng" cho tương lai. Nếu không thì việc lưu một tài liệu tham khảo là hơi vô nghĩa. Điều tương tự có thể đã được thực hiện bằng cách đơn giản là lưu uidvà tham chiếu thông qua nó.
Jürgen Brandstetter

4
Cảm ơn ví dụ! Nhưng điểm lưu trữ loại tham chiếu là gì nếu không có loại tùy chọn "dân cư" khi chúng tôi truy vấn tài liệu? Nếu có một tùy chọn dân cư mà bất cứ ai biết, xin vui lòng cho tôi biết.
Harshil Shah

18
Vì vậy, trên thực tế nó không giống như một khóa ngoại. Đối với tôi về cơ bản nó không có gì - điểm cần có referencenếu chúng ta không thể sử dụng nó như một khóa ngoại thực sự sẽ hoạt động?
jean

14
Vì vậy, lợi thế duy nhất của a referencehơn stringlà, bạn có thể gọi get()trực tiếp trên tài liệu tham khảo. Không hữu ích lắm. Hy vọng họ thêm một tùy chọn để tự động điền các tham chiếu với các đối tượng tương ứng!
morgler

16

Đối với những người tìm kiếm một giải pháp Javascript để truy vấn theo tham chiếu - khái niệm là, bạn cần sử dụng một đối tượng 'tham chiếu tài liệu' trong câu lệnh truy vấn

teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
  //
}).catch(function(error) {
  //
});

(Kudos cho câu trả lời ở đây: https://stackoverflow.com/a/53141199/1487867 )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.