2016-06-24 72 views
11

比方說,我有一些數據如下:如何通過firebase的兒童價值降序排列?

{ 
    "name": "post #1", 
    "votes": 100 
}, 
{ 
    "name": "post #2", 
    "votes": 10000 
}, 
{ 
    "name": "post #3", 
    "votes": 750 
} 

等。

firebase中的數據不是通過投票明顯排序的,它是按鍵排序的。

我希望能夠通過投票數降序排列這些數據。

我想我不得不這樣做:

ref.orderByChild('votes') 
    .startAt(someValue) 
    .limitToFirst(someOtherValue) 
    .once('value', function(snapshot) { 
     resolve(snapshot); 
    }); 

也許,我需要使用limitToLastendAt

key的分頁很容易,但是這個正在困擾着我。

更新(二〇一七年十月十六日):最近火力地堡宣佈Firestore - 他們完全託管的NoSQL數據存儲這應該更容易做更復雜的查詢。可能還有一些用例可能會使用他們一直提供的Realtime數據庫。如果你是其中一個人,這個問題仍然適用。

+0

查看http://stackoverflow.com/questions/27195851/how-to-retrieve-paginated-children-in-ascending-or-descending-order-in-firebase/33484784#33484784 –

+0

@FrankvanPuffelen您的鏈接是一個問題,然後鏈接回我的答案下面。可能你們考慮將這些信息添加到Firebase文檔中? –

回答

23

我在編程一整天后發佈了這個問題,我的大腦很好。

今天早上我又對它進行了一次破解,就像往常一樣,我能夠很快找到解決方案。

解決方案:

爲了分頁的數據,我們需要從任意一個列表的中間拉排序的數據的能力。您可以使用由火力API提供以下功能做到這一點:

startAt

endAt

limitToFirst

limitToLast

更多信息,可以發現here

就我而言,由於我需要我的數據以降序排列,因此我將使用endAtlimitToLast

假設我想讓每個頁面都有五個項目。我會寫我的第一個查詢,像這樣:

ref.orderByChild('votes') 
    .limitToLast(5) 
    .once('value', function(snapshot) { 
     console.log('Snap: ', snapshot.val()); 
    }); 

這得到了5項與最高票數。

爲了獲得下一頁,我們需要存儲兩個數據片段從我們上次查詢的結果。我們需要存儲投票數量,併爲投票數最少的項目提供關鍵字。也就是說,我們列表中的最後一項。

利用這些數據,我們的下一個查詢,所有後續查詢,將如下所示:

ref.orderByChild('votes') 
    .endAt(previousVoteCount, previousKey) 
    .limitToLast(5) 
    .once('value', function(snapshot) { 
     console.log('Snap: ', snapshot.val()); 
    }); 

您將在此查詢我加endAt通知。這將獲得從前一列表中最後一個開始票數最多的下5個項目。我們必須在上一個列表中包含最後一個項目的關鍵字,以便如果有多個項目具有相同的投票數量,它將返回一個以正確項目開頭的列表,而不是它找到的第一個項目的投票,這可能在您從最初的查詢中獲得的列表中間的某個位置。

就是這樣!

+0

該解決方案是否適用於許多相同價值的商品?例如以下分數:[5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7。在現實世界的情況下,沒有多少高票職位將會分享相同的價值,但是很多低分值將會。這個問題在我上面的@ frank-van-puffelen強調的SO問題中有所評論。 – Pandaiolo

+0

假設您將數據存儲在帶有Firebase密鑰的單個列表中,那麼查詢的orderByChild部分將首先按照「投票」進行排序,然後應該有多個投票數相同的投票,然後按鍵排序。 –

+1

所以這意味着,如果在查詢的'endAt'部分中包含'previousKey'參數,則可以精確分頁。 –