2016-04-12 20 views
0

Bir Firebase koleksiyonuna hızlıca sorgulama yapmayı deniyorum.İç içe geçmiş öğeleri Firebase'de sorgulama

{ 
    "networks" : { 
    "-KF9zQYGA1r_JiFam8gd" : { 
     "category" : "friends", 
     "members" : { 
     "facebook:10154023600052295" : true 
     }, 
     "name" : "My friends", 
     "owner" : "facebook:10154023600052295", 
     "picture" : "https://my.img/img.png" 
    }, 
    "-KF9zQYZX6p_ra34DTGh" : { 
     "category" : "friends", 
     "members" : { 
     "tototata" : true 
     }, 
     "name" : "My friends2", 
     "owner" : "facebook:10154023600052295", 
     "picture" : "https://my.img/img.png" 
    } 
    } 

ve benim sorgu böyledir:

My Collection böyledir

let networksRef = ref.childByAppendingPath("networks") 
        .queryOrderedByChild("members") 
        .queryEqualToValue(true, childKey: uid) 

Sonra bir TableView kullanarak FirebaseUI doldurma ediyorum.

let networksRef = ref.childByAppendingPath("networks") 
        .queryOrderedByChild("members") 
        .queryStartingAtValue(true, childKey: uid) 
        .queryEndingAtValue(true, childKey: uid) 

Ve net "uid" olmak "üyeleri" düğümle iç içe düğüm adıdır:

şey sorgu şey dönmez, ben de sorgunun bu tür kullanarak çalıştı değer olarak doğrudur. (Resimde olduğu gibi)

Yüklenecek veri miktarı nedeniyle filtrelemeden tüm düğümleri alamıyorum.

Bir gün o şaşırıp ve deliriyorum ..

birisi yardımcı olabilir

:-)?

let networksRef = ref.childByAppendingPath("networks") 
        .queryOrderedByChild("members/\(uid)") 
        .queryEqualToValue(true) 

Ama bu verimli çalışabilmesi için her uid için bir dizin gerektiğini unutmayın:

+0

Soruyu istediğim gibi güncelledim. – poms32

+0

Yorumları temizleme. –

cevap

2

doğru sözdizimi olurdu

{ 
    "rules": { 
    "networks": { 
     ".indexOn": ["facebook:10154023600052295", "tototata"] 
    } 
    } 
} 

bu endeksler olmadan, Firebase istemci olacak tüm verileri indir ve filtrelemeyi yerel olarak yap. Sonuç aynı olacak, ancak çok fazla gereksiz bant genişliği tüketecektir.

Bunun için uygun bir çözüm, veri yapınızı değiştirmenizi gerektirir. Firebase'de (ve diğer birçok NoSQL veritabanında) genellikle verilerinizi uygulamanızın erişmek istediği şekilde modellemesiyle sonuçlanırsınız. , documentation on data structuring denormalizing denir veri yapısına bu sözde indeksi ekleme

"networks_per_uid": { 
    "facebook:10154023600052295": { 
    "-KF9zQYGA1r_JiFam8gd": true 
    }, 
    "tototata": { 
    "-KF9zQYZX6p_ra34DTGh": true 
    }, 
} 

ve this blog post yılında tanıtır şudur: Bir kullanıcı bir parçası olan ağlar için aradığınız olduğundan, kullanıcı başına ağları saklamalısınız ve bu harika makale hakkında NoSQL data modeling.

+0

TEŞEKKÜR EDERİZ! sadece cevap için değil, bunu yapmanın daha iyi yolu için! Tüm verilerimi düzgün bir şekilde yeniden sıralamaya çalışacağım! – poms32

+0

@ frank-van-puffelen - indeksin gerçekten ".indexOn": ["facebook: 10154023600052295", "tototata"] veya ".indexOn" olması gerekir: ['üye'] aynı sonucu elde etmek ister mi? –

+0

Aramak istediğiniz mülkte olmalı. Mülkün kullanıcı UID'si ile aranıyor, yani dizine eklemeniz gerekecek. Cevabım açıkladığı gibi, bu genellikle ihtiyaçlarınız için yanlış veri yapısının kullanılmasının sonucudur. Daha uzun bir açıklama için bkz. Http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value –

İlgili konular