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 orderByChild
và equalTo
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".
Nguồn
2014-11-29 23:53:58
Xem thêm http://stackoverflow.com/questions/24869180/query-hierarchical-data-structure-in-firebase – Kato
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