2016-07-04 19 views
21

Xét cấu trúc dữ liệu này:Cách truy xuất nhiều khóa trong Firebase?

{ 
    "users":{ 
     "user-1":{ 
      "groups":{ 
       "group-key-1":true, 
       "group-key-3":true 
      } 
     } 
    }, 
    "groups":{ 
     "group-key-1":{ 
      "name":"My group 1" 
     }, 
     "group-key-2":{ 
      "name":"My group 2" 
     }, 
     "group-key-3":{ 
      "name":"My group 3" 
     }, 
     "group-key-4":{ 
      "name":"My group 4" 
     }, 
    } 
} 

tôi có thể nhận được các nhóm của một người dùng cụ thể với:

firebase.database().ref('users/user-1/groups').on(...) 

Trong đó sẽ cho tôi đối tượng này:

{ 
    "group-key-1":true, 
    "group-key-3":true 
} 

Vì vậy, bây giờ tôi muốn để truy xuất thông tin cho các nhóm đó.

bản năng đầu tiên của tôi sẽ là để lặp những phím và thực hiện điều này:

var data = snapshot.val() 
var keys = Object.keys(data) 

for (var i = 0; i < keys.length; i++) { 
    firebase.database().ref('groups/' + keys[i]).on(...) 
} 

Đây có phải là cách thích hợp để gọi nhiều phím trên thiết bị đầu cuối cùng trong căn cứ hỏa lực?

Firebase có cung cấp cách tốt hơn để giải quyết vấn đề này không?

+0

Xem http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 –

Trả lời

15

Đây có phải là cách thích hợp để gọi nhiều phím trên cùng một điểm cuối trong Firebase không?

Có, nói chung đây là giải pháp tốt để truy xuất mọi nhóm theo cách này.

Firebase có cung cấp cách tốt hơn để giải quyết vấn đề này không?

Tôi không nghĩ Firebase cung cấp bất kỳ chức năng/truy vấn nào khác có thể hữu ích trong trường hợp này.

Dù sao, điều này có thể được cải thiện tiết kiệm ref trong một biến và looping trên các phím của đối tượng trực tiếp. Ngoài ra, nếu bạn chỉ cần lấy những dữ liệu một lần, bạn nên sử dụng once() thay vì on()

var groupRef = firebase.database().ref('groups/') 
var data = snapshot.val() 

for (var groupID in data) { 
    groupRef.child(data[groupID]).once(...) 
} 

Một cách khác có thể sử dụng căn cứ hỏa lực của functions cho các bức ảnh chụp dữ liệu, như foreach

snapshot.forEach(function(childSnapshot) { 
     groupRef.child(childSnapshot.key).once(...) 
}) 
+3

suy nghĩ tốt đẹp về forEach! :) – adolfosrs

+0

Cảm ơn @adolfosrs! Câu trả lời của bạn về người nghe pipelined là một điểm tốt đẹp quá :) –

4

Có, bạn đang đi đúng hướng. Như được viết trong cơ sở dữ liệu this question sẽ phân phối các yêu cầu của bạn và bạn sẽ không phải lo ngại về hiệu suất và thời gian khứ hồi. Ngay khi bắt đầu lặp lại, bạn sẽ nhận được dữ liệu firebase. Vì vậy, hãy nhớ để xử lý nó đúng cách trong ui của bạn.

Tùy chọn khác, tùy thuộc vào mức độ dữ liệu /groups của bạn tăng lên, giữ lại ảnh chụp nhanh (có thể là $firebaseObject nếu bạn đang sử dụng góc) của toàn bộ chi nhánh /groups sẽ làm mới bất cứ khi nào dữ liệu thay đổi. Sau đó, bạn chỉ cần theo dõi ảnh chụp nhanh này. Nhưng một lần nữa, nếu bạn đang có kế hoạch để chơi với một số lượng lớn các nhóm giải pháp hiện tại của bạn là một lựa chọn tốt hơn.

Ngoài ra, tôi khuyên bạn nên cẩn thận thiết lập sự kiện on cho mỗi nhóm bạn truy xuất. Hãy nhớ rằng cuộc gọi lại sẽ được kích hoạt bất cứ khi nào dữ liệu thay đổi (phụ thuộc vào sự kiện đã được giải quyết). Tùy thuộc vào trường hợp sử dụng của bạn, bạn nên xem xét sử dụng .once("value" vì nó sẽ kích hoạt dữ liệu chỉ một lần, làm cho dữ liệu trở nên đáng tin cậy hơn, hiệu quả hơn và sẽ tránh xử lý các cuộc gọi lại khi bạn không mong đợi chúng.

Các vấn đề liên quan