2015-12-05 10 views
8

Ich baue eine soziale App mit Firebase. Ich speichern Beiträge in Firebase wie folgt:Filtern und Sortieren von mehreren Werten mit Firebase

posts: { 
    "postid": { 
     author: "userid" 
     text: "", 
     date: "timestamp" 
     category: "categoryid" 
     likes: 23 
    } 
} 

Jeder Beitrag gehört zu einer Kategorie und es ist möglich, Beiträge zu mögen.

Jetzt versuche ich Beiträge zu zeigen, die zu einer bestimmten Kategorie gehören, sortiert nach der Anzahl der Likes. Es ist möglich, dass ich auch den Filter nach Datum begrenzen möchte, um nur die neuesten, beliebtesten Beiträge in einer Kategorie anzuzeigen. Wie kann ich das machen?

Firebase Abfragefunktionalität scheint nicht mehrere Anfragen wie diese zu unterstützen, die seltsam scheint ...

+0

Siehe http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase – Kato

Antwort

11

Sie eine nur with Firebase database queries Bestellfunktion nutzen können, aber richtige Datenstruktur ermöglicht es Ihnen, durch mehrere Felder abfragen.

In Ihrem Fall möchten Sie nach Kategorie bestellen. Anstatt Kategorie als Eigenschaft hat, kann es als Index handelt unter posts:

posts: { 
    "categoryid": { 
     "postid": { 
     author: "userid" 
     text: "", 
     date: "timestamp", 
     category: "categoryid", 
     likes: 23 
     } 
    } 
} 

Jetzt können Sie eine Abfrage schreiben, um alle Beiträge unter einer bestimmten Kategorie zu bekommen.

let postsRef = Firebase(url: "<my-firebase-app>/posts") 
let categoryId = "my-category" 
let categoryRef = postsRef.childByAppendingPath(categoryId) 
let query = categoryRef.queryOrderedByChild("date") 
query.observeEventType(.ChildAdded) { (snap: FDataSnapshot!) { 
    print(snap.value) 
} 

Der obige Code erstellt eine Referenz für Beiträge nach einer bestimmten Kategorie und Bestellungen nach dem Datum. Die Mehrfachabfrage ist durch die Datenstruktur möglich. Die Rückruffunktion wird für jedes einzelne Element unterhalb der angegebenen Kategorie ausgelöst.

Wenn Sie weiter abfragen möchten, müssen Sie eine clientseitige Filterung der Daten vornehmen.

+1

Danke für die Antwort! Das könnte funktionieren, aber ich speichere Verweise auf die Posts (nur die ID des Posts speichernd) an anderen Orten (zum Beispiel in Benutzer-Feeds usw.). Mit der von Ihnen vorgeschlagenen Lösung wäre es unmöglich, die eigentlichen Post-Daten nur mit der Post-ID zu erhalten, da ich auch die Kategorie-ID benötigen würde, um auf den richtigen Knoten zu "drill-down" zu gehen ... Denn soweit ich weiß Es ist nicht möglich, Wildcards (*) in Pfaden zu verwenden, wenn Sie die Datenbank abfragen, wie zum Beispiel/posts/*/[postid]? – andlin

+1

Eine Lösung ist natürlich, die Kategorie zu speichern, zu der ein Post in einem anderen Knoten gehört, wie zum Beispiel/category_for_post/[postid]/[categoryid], aber das bedeutet, dass ich jedes Mal eine zusätzliche Abfrage für diese Information machen muss tatsächliche Daten für einen Post. – andlin

+0

@andlin: Ja, Sie können auch Kategorien wie "Tags" speichern und nach diesen Tags suchen. Sie können immer noch die obige Struktur verwenden, aber nennen Sie es '/ categoryPosts' und speichern Sie dann alle Beiträge in' posts'. Es ist in Ordnung, die Daten zu duplizieren, da dies zu schnelleren Lesevorgängen führt und Sie diese mit dem clientseitigen Fanout konsistent halten können. https://www.firebase.com/blog/2015-10-07-how-to-keep-your-data-consistent.html –

Verwandte Themen