2015-05-11 41 views
7

Okuduğum her şeyden, çok düzeyli bir değer sorgulamak mümkün görünmüyor. Benim veri yapısı aşağıdaki gibidir:Torun/çok düzeyli sorgulamayı sorgulama Firebase

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

dinozorlar anahtar adını bilmeden, John tarafından eklenen tek öğeler alınırken meta düğümü sorgulamak için zaten yoktur.

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

hacky çözüm vardır ama hiçbiri ben sadece bu veriyi dümdüz olmalı, ölçeklenebilir şunlardır: gibi JS Something

?

Düzenleme:

Bir kod inceleme gerekir ... Bu kabul edilebilir bir çözüm olurdu?

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

Dikkatli olun: bir "açık" olduğunda, her zaman ilgili "kapalı" ne zaman gerçekleşeceğini düşünmelisiniz. Üst düzey için "açık", "sayfa/uygulama kapalıyken" olabilir, ancak "child_added" öğesindeki "on" öğeniz, zaman içinde dinleyicilerin oluşturulmasına neden olur. Bunu çözmenin ortak yolu, döngüde 'bir kere 'kullanmaktır, ancak bu genellikle de en düşük performansa yol açar. –

+2

Ayrıca bkz: http://stackoverflow.com/questions/30151012/is-there-a-way-in-angularfire-to-query-for-matching-and-condition –

cevap

5

Sorgular yalnızca 1 seviye derin olabilir. Bir takım çözümler var ama verilerinizi düzleştiriyor ve bağlantı/referanslama bir seçenektir. Yukarıdaki örnekte, kullanıcı adlarını (ana) ekledikleri dinozorlara (alt) bağlayan başka bir düğüm oluşturabilirdiniz. Sonra John düğümü okuyup hangi dinozorların eklediğini hemen öğrenebilir. Daha sonra bu dino ile ilgili diğer ilgili verilere erişebilmek; tarih vb yüksekliği

users 
    John 
    bruhathkayosaurus 
    Styracosaurus 
    Lambeosaurus 
    Spinosaurus 
    Peter 
    Lambeosaurus 
    Seismosaurus 

Muhtemelen uid Onun yerine isimleri kullanmak isteyeceksiniz ama fikir olsun göründü ekledi.

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

Edit Ocak 2016: Olamadığınızda düzleşmiş olabilir böylece listelenen örnekte meta düğüm var neden

Ayrıca, net değil biraz daha derine sorgulayabilir nedenle bu cevap beri Firebase Derin Sorgular vardır 1 seviyeden.