2014-11-29 25 views
14

Với cấu trúc dữ liệu bên dưới trong căn cứ hỏa hoạn, tôi muốn chạy truy vấn để truy xuất blog 'efg'. Tôi không biết id người dùng tại thời điểm này.Truy vấn Firebase Double Nested

{Users : 
    "1234567": { 
      name: 'Bob', 
      blogs: { 
       'abc':{..}, 
       'zyx':{..} 
      } 
    }, 
    "7654321": { 
      name: 'Frank', 
      blogs: { 
       'efg':{..}, 
       'hij':{..} 
      } 
    } 
} 
+0

Xem thêm http://stackoverflow.com/questions/24869180/query-hierarchical-data-structure-in-firebase – Kato

+2

Thực sự không có lý do gì để có blog như một phần của hồ sơ của người dùng. Chúng không phải là "thuộc tính" hợp lý của người dùng, chúng là một thực thể riêng biệt với các cấu trúc dữ liệu, mục đích và các kịch bản đọc/ghi riêng của chúng. Tôi bắt đầu bằng cách tách những thứ đó (như Frank đã đề cập) và làm cho mọi việc đơn giản và trực tiếp. – Kato

Trả lời

19

API căn cứ hỏa lực chỉ cho phép bạn lọc trẻ một mức độ sâu (hoặc with a known path) với orderByChildequalTo phương thức của nó.

Vì vậy mà không sửa đổi/mở rộng cấu trúc dữ liệu hiện tại của bạn mà chỉ để lại tùy chọn để lấy tất cả dữ liệu và lọc nó client-side:

var ref = firebase.database().ref('Users'); 
ref.once('value', function(snapshot) { 
    snapshot.forEach(function(userSnapshot) { 
     var blogs = userSnapshot.val().blogs; 
     var daBlog = blogs['efg']; 
    }); 
}); 

Đây là khóa học rất hiệu quả và sẽ không mở rộng khi bạn có số lượng người dùng/blog không nhỏ.

Vì vậy, các giải pháp chung cho đó là một chỉ số cái gọi là cây của bạn mà các bản đồ chìa khóa mà bạn đang tìm kiếm để con đường nơi nó cư trú:

{Blogs: 
    "abc": "1234567", 
    "zyx": "1234567", 
    "efg": "7654321", 
    "hij": "7654321" 
} 

Sau đó, bạn có thể nhanh chóng truy cập vào blog sử dụng:

var ref = firebase.database().ref(); 
ref.child('Blogs/efg').once('value', function(snapshot) { 
    var user = snapshot.val(); 
    ref.child('Blogs/'+user+'/blogs').on('value, function(blogSnapshot) { 
     var daBlog = blogSnapshot.val(); 
    }); 
}); 

bạn cũng có thể muốn xem xét lại nếu bạn có thể tái cấu trúc dữ liệu của bạn để phù hợp hơn use-case của bạn và hạn chế căn cứ hỏa lực của. Họ có một số tài liệu tốt về cấu trúc dữ liệu của bạn, nhưng điều quan trọng nhất đối với những người mới vào cơ sở dữ liệu NoSQL/phân cấp có vẻ là "avoid building nests".

+0

cảm ơn bạn tuyệt vời – denisjacquemin

+14

Lưu ý rằng [truy vấn sâu] (https://www.firebase.com/blog/2015-09-24-atomic-writes-and-more.html) hiện là một tính năng. – Kato

+3

Tôi đã nghĩ về nó trong vài phút, nhưng bỏ cuộc: truy vấn sâu sẽ giải quyết vấn đề này như thế nào? –

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