2014-11-29 19 views
14

Firebase'de aşağıdaki veri yapısı göz önüne alındığında, 'efg' blogunu almak için bir sorgu çalıştırmak istiyorum. Bu noktada kullanıcı kimliğini bilmiyorum.Firebase Sorgusu Çift Yuvalanmış

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

Ayrıca bkz. Http://stackoverflow.com/questions/24869180/query-hierarchical-data-structure-in-firebase – Kato

+2

Kullanıcı kayıtlarının bir parçası olarak blogların olması için gerçekten hiçbir neden yok. Bir kullanıcının mantıksal bir "özniteliği" değil, kendi veri yapıları, amacı ve okuma/yazma senaryolarıyla ayrı bir varlıktırlar. Bunları (Frank'in bahsettiği gibi) bölmek ve işleri basit ve doğrudan yapmakla başlarım. – Kato

cevap

19

Firebase Yalnızca API onun orderByChild ve equalTo yöntemlerle bir seviye derin (veya with a known path) çocukları filtre sağlar.

Yani sadece tüm verileri almak ve ona istemci tarafı filtreleme seçeneği bırakır mevcut veri yapısını genişleterek/değiştirmeden:

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

Bu tabii son derece verimsiz ve zaman ölçek olmaz önemsiz sayıda kullanıcı/blogunuz var.

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

Sonra hızlı blog erişebilirsiniz:

Yani bu ortak çözüm bunu bulunduğu yola aradığınız anahtar haritalar sizin ağacına sözde endeksi etmektir kullanarak: Ayrıca daha iyi bir kullanım durumunun ve Firebase en sınırlamaları sığdırmak için verilerinizi yeniden eğer yeniden isteyebilirsiniz

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(); 
    }); 
}); 

. Verilerinizi yapılandırmak için bazı iyi belgelere sahipler, ancak NoSQL/hiyerarşik veritabanlarında yeni olan insanlar için en önemli olan "avoid building nests".

+0

müthiş teşekkürler – denisjacquemin

+14

Not: [derin sorgular] (https://www.firebase.com/blog/2015-09-24-atomic-writes-and-more.html) artık bir özellik. – Kato

+3

Birkaç dakika düşündüm ama pes etmeyin: Derin bir sorgu bu problemi nasıl çözer? –