2015-05-11 30 views
7

Từ mọi thứ tôi đã đọc, dường như không thể truy vấn giá trị đa cấp. cấu trúc dữ liệu của tôi trông giống như sau:Truy vấn Firebase cháu/truy vấn đa cấp

{ 
"dinosaurs": { 
    "bruhathkayosaurus": { 
     "meta":{ 
      "addedBy":"John", 
      "addedDate":"02021987" 
     }, 
     "appeared": -70000000, 
     "height": 25 
    }, 
    "lambeosaurus": { 
     "meta":{ 
      "addedBy":"Peter", 
      "addedDate":"12041987" 
     }, 
     "appeared": -76000000, 
     "height": 2.1 
    } 
} 
} 

Mà không biết tên chủ chốt của khủng long, là có anyway để truy vấn các nút meta lấy chỉ mục được thêm vào bởi John.

Trong JS Một cái gì đó như:

var ref = new Firebase('test.firebaseio.com/dinosaurs'); 
    ref.orderByChild("meta/addedBy") 
    .equalTo('Peter') 
    .on("child_added", function(snapshot) { 
     console.log(snapshot); 
    }); 

Có nhiều giải pháp hacky nhưng không ai là khả năng mở rộng, nên tôi chỉ làm phẳng dữ liệu này?

Edit:

tôi cần xem xét mã ... điều này sẽ là một giải pháp có thể chấp nhận?

var ref = new Firebase('test.firebaseio.com/dinosaurs'); 
    ref.orderByChild("meta") 
    .on('child_added',function(snap1){ 
     snap1.ref().orderByChild("addedBy") 
     .equalTo("Peter") 
     .on('child_added', function(snap2) { 
      console.log(snap2.val()); 
     }) 
    }); 
+1

Hãy cẩn thận: khi bạn có 'on', bạn nên luôn xem xét khi' off' tương ứng xảy ra. Đối với cấp cao nhất 'on' có thể là "khi trang/ứng dụng bị đóng", nhưng 'on' của bạn trong cuộc gọi lại' child_added' sẽ dẫn đến việc xây dựng người nghe theo thời gian. Cách phổ biến để giải quyết vấn đề này là sử dụng 'once' trong vòng lặp, nhưng điều này thường dẫn đến hiệu suất tối ưu. –

+2

Cũng thấy: http://stackoverflow.com/questions/30151012/is-there-a-way-in-angularfire-to-query-for-matching-and-condition –

Trả lời

5

Truy vấn chỉ có thể sâu 1 cấp. Có một số giải pháp nhưng làm phẳng dữ liệu của bạn và liên kết/tham chiếu là một tùy chọn.

Trong ví dụ trên, bạn có thể tạo một nút khác liên kết tên người dùng (cha mẹ) với các con khủng long (trẻ em) mà chúng đã thêm vào. Sau đó, nút John có thể được đọc và ngay lập tức biết những con khủng long mà anh ta thêm vào. Sau đó, có thể truy cập dữ liệu có liên quan khác về khủng long đó; đã thêm, xuất hiện, chiều cao, v.v.

users 
    John 
    bruhathkayosaurus 
    Styracosaurus 
    Lambeosaurus 
    Spinosaurus 
    Peter 
    Lambeosaurus 
    Seismosaurus 

Có thể bạn sẽ muốn sử dụng uid thay vì tên nhưng bạn có ý tưởng.

Ngoài ra, nó không phải là rõ ràng lý do tại sao có một nút meta trong ví dụ được liệt kê để nó có thể được san phẳng thusly:

"dinosaurs": { 
    "bruhathkayosaurus": { 
     "addedBy":"John" 
     "addedDate":"02021987" 
     "appeared": -70000000 
     "height": 25 
    }, 

Sửa Tháng 1 năm 2016: Kể từ khi câu trả lời này, căn cứ hỏa lực có truy vấn sâu, do đó bạn có thể truy vấn sâu hơn hơn 1 cấp độ.

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