Firebase'in Sorgu API'sını kullanarak şunları denemek isteyebilirsiniz:
// !!! THIS WILL NOT WORK !!!
ref
.orderBy('genre')
.startAt('comedy').endAt('comedy')
.orderBy('lead') // !!! THIS LINE WILL RAISE AN ERROR !!!
.startAt('Jack Nicholson').endAt('Jack Nicholson')
.on('value', function(snapshot) {
console.log(snapshot.val());
});
Ancak Firebase'den @RobDiMarco'nun yorumlarda belirttiği gibi:
birden fazla orderBy()
çağrı hata verir
Yani yukarıdaki kodum çalışmaz .
İşe yarayacak üç yaklaşım biliyorum.
1. sunucuda en filtre, istemcide gerisini
Ne yapabilirsiniz yapmak birini yürütmek olduğunu orderBy().startAt()./endAt()
, sunucu üzerindeki istemci üzerinde olduğunu JavaScript kodunda kalan verileri ve filtreyi aşağı çekin.
ref
.orderBy('genre')
.equalTo('comedy')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
if (movie.lead == 'Jack Nicholson') {
console.log(movie);
}
});
2. üzerinde filtrelemek istediğiniz değerleri birleştiren bir özellik ekleyin
Bu yeterince iyi değilse, kullanım durumunuza izin vermek için verilerinizi değiştirmeyi / genişletmeyi düşünmelisiniz. Örneğin: sadece bu filtre için kullandığınız tek bir özelliğe tür + yol ekleyebilirsiniz.
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson",
"genre_lead": "comedy_Jack Nicholson"
},...
Temel olarak kendi çok sütunlu dizininizi bu şekilde oluşturuyorsunuz ve şu şekilde sorgulayabilirsiniz:
ref
.orderBy('genre_lead')
.equalTo('comedy_Jack Nicholson')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
console.log(movie);
});
David East, QueryBase adında, bu tür mülklerin oluşturulmasına yardımcı olan bir kütüphane yazmıştır .
Göreli / aralık sorguları bile yapabilirsiniz, diyelim ki filmleri kategoriye ve yıla göre sorgulamaya izin vermek istiyorsunuz. Bu veri yapısını kullanırsınız:
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson",
"genre_year": "comedy_1997"
},...
Ve sonra 90'ların komedilerini sorgulayın:
ref
.orderBy('genre_year')
.startAt('comedy_1990')
.endAt('comedy_2000')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
console.log(movie);
});
Yalnızca yıldan daha fazla filtrelemeniz gerekiyorsa, diğer tarih parçalarını azalan sırada eklediğinizden emin olun, örn "comedy_1997-12-25"
. Bu şekilde, Firebase'in dize değerleri üzerinde yaptığı sözlükbilimsel sıralama kronolojik sıralama ile aynı olacaktır.
Bir özellikteki değerlerin bu birleştirilmesi ikiden fazla değerle çalışabilir, ancak bir aralık filtresini yalnızca kompozit özellikteki son değer üzerinde yapabilirsiniz.
Bunun çok özel bir çeşidi, Firebase için GeoFire kütüphanesi tarafından uygulanır . Bu kütüphane, bir konumun enlemini ve boylamını , daha sonra Firebase'de gerçek zamanlı aralık sorguları yapmak için kullanılabilen Geohash olarak adlandırır .
3. programlı olarak özel bir dizin oluşturma
Başka bir alternatif, bu yeni Sorgu API'sı eklenmeden önce yaptığımız şeyleri yapmaktır: farklı bir düğümde bir dizin oluşturmak:
"movies"
// the same structure you have today
"by_genre"
"comedy"
"by_lead"
"Jack Nicholson"
"movie1"
"Jim Carrey"
"movie3"
"Horror"
"by_lead"
"Jack Nicholson"
"movie2"
Muhtemelen daha fazla yaklaşım var. Örneğin, bu cevap, ağaç şeklinde alternatif bir özel dizini vurgular: https://stackoverflow.com/a/34105063
orderBy()
, istemciler beklenmedik sonuçlar verdikleri için birden fazla çağrı hata verecektir. Testinizde tesadüfen işe yaramış olabilir, ancak bunu genel olarak çalışmak için inşa edilmemiştir (eklemeyi çok isteriz!).