2017-02-09 166 views
0

火力地堡數據:火力地堡計數兒童

{ 
    "data": { 
     "entry-1": { 
      "created": 1484634400, 
      "status": 1 
     }, 
     "entry-2": { 
      "created": 1482612312, 
      "status": 0 
     }, 
     "entry-3": { 
      "created": 1481623400, 
      "status": 1 
     }, 
     "entry-4": { 
      "created": 1485613233, 
      "status": 1 
     }, 
     "entry-5": { 
      "created": 1489513532, 
      "status": 0 
     }, 
     "entry-6": { 
      "created": 1483123532, 
      "status": 1 
     }, 
     "entry-7": { 
      "created": 1481282376, 
      "status": 1 
     }, 
     "entry-8": { 
      "created": 1432321336, 
      "status": 1 
     }, 
     "entry-9": { 
      "created": 1464282376, 
      "status": 0 
     } 
    } 
} 

我想看看有多少活躍條目(status = 1)entry-4之前創建的,並保持實時更新計數。

今天我聆聽數據庫中的每一個變化,但它消耗了大量不必要的數據。有一個更好的方法嗎?


代碼:

FIRDatabaseQuery *query = [self.firebase child:@"data"]; 
[query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { 
    int count = 0; 
    for (FIRDataSnapshot *child in snapshot.children) { 
     if (child.value[@"status"] == 1 && child.value[@"created"] < 1485613233) { 
      count++; 
     } 
    } 
}]; 
+1

Firebase數據庫中沒有計數運算符。爲了防止必須下載所有項目以獲得計數,您可以保留一個單獨的'count'節點 - 然後您可以更新事務。請參閱http://stackoverflow.com/questions/15148803/in-firebase-is-there-a-way-to-get-the-number-of-children-of-a-node-without-load/15149311#15149311 –

+1

Firebase最近發佈了雲端功能。看看這個[回答](http://stackoverflow.com/a/42713792/5861618)瞭解更多詳情 –

回答

0

我提供SWIFTY的答案,但它很容易轉換爲對象 -

更改您的數據結構來此

{ 
    "data": { 
     "-Yuna99s993m": { 
      "created": 1484634400, 
      "status": "1" 
      "entry": "1" 
      "status_entry": "1_1" 
     }, 
     "-YUjns0909ks": { 
      "created": 1482612312, 
      "status": "0" 
      "entry": "2" 
      "status_entry": "0_2" 
     }, 
     "-Y8hj98nmswm": { 
      "created": 1481623400, 
      "status": "1" 
      "entry": "3" 
      "status_entry": "1_3" 
     }, 
     "-Y78903kjmsk": { 
      "created": 1485613233, 
      "status": "1" 
      "entry": "4" 
      "status_entry": "1_4" 
     }, 
     "-YJuikw9klkos": { 
      "created": 1489513532, 
      "status": 0 
      "entry": "5" 
      "status_entry": "0_5" 
     }, 

然後,查詢以檢索4之前的所有條目,狀態爲1

let dataRef = ref.child("data") 
let queryRef1 = dataRef.queryOrdered(byChild: "status_entry") 
let queryRef2 = queryRef1.queryStarting(atValue: "1_1") 
         .queryEnding(atValue: "1_3") 
queryRef2.observeSingleEvent(of: .value, with: { snapshot in 
    print(snapshot.childrenCount) 
}) 

運行時,該返回

2 

這意味着存在具有爲1的狀態條目4之前兩個節點;這些節點是

"-Yuna99s993m": { 
    "created": 1484634400, 
    "status": "1" 
    "entry": "1" 
    "status_entry": "1_1" 
"-Y8hj98nmswm": { 
    "created": 1481623400, 
    "status": "1" 
    "entry": "3" 
    "status_entry": "1_3" 

*像「-Yuna99s993m」節點名稱與childByAutoId創建 - 它通常是從它們所包含的子數據撇清節點鍵名的最佳實踐。

這裏的思考過程是,通過將兩個變量(條目號和狀態)組合到一個變量status_entry中,我們限制了startingAt和endingAt返回的內容。因此1_x將消除所有0_狀態,並且通過指定從x_1到x_3的條目來進一步限制返回的節點。

訣竅是在x_4之前獲取節點,因爲它將成爲.endingAt。如果它總是x_3,那麼很簡單。