2017-05-10 23 views
0

解決方案: 正如弗蘭克已經指出,我必須創建一個單獨的領域,這種排序工作。使用Firebase orderByChild(1)並按小孩篩選任何解決方案?

function createTestDataSet(){ 
    evd = dbAllEventsListRef; 

    evd.on('child_added', function(snap, previous){ 
     console.log(snap.val()); 
     data = snap.val(); 
     data.sortField = data.clubKey + "_" + data.startDate; 
     testDiv = document.getElementById("divCarSummary"); 
     testDiv.innerHTML = testDiv.innerHTML + "<br/>"+data.sortField; 
     evd.child(snap.key).set(data); 
    }); 
} 

我測試過下面這樣的:作爲建議,我創建了一個申請「的SortField」它結合了

"clubKey" + "_" + "startDate" 

要修改我現有的數據集,我做了一個快速的Java腳本函數這樣代碼:

function testSort(){ 
    key = "manualClubKey-1"; 
    testEvents = dbTesting.child('eventList').orderByChild("sortField").startAt(key+"_").endAt(key+"a"); 
    testEvents.on('child_added', function(snap, previous){ 
     data = snap.val(); 
     testDiv = document.getElementById("divCarSummary"); 
     testDiv.innerHTML = testDiv.innerHTML + "<br/>"+data.startDate+", "+data.name+", "+snap.key+", "+data.clubKey; 

     console.log(snap.val()); 
    }); 
} 

棘手的部分是,對於 「ENDAT」 手動規定:

The ending point is inclusive, so children with exactly the specified value will be included in the query 

但這似乎並不正確。 如果我爲startAt()和endAt()給出相同的值,則不會得到任何結果。 所以我修改了查詢,我查找了「clubKey」+分隔符。對於分隔符,我在「_」之後給出了一個字符。因此它就像一種魅力。

我修改了我的android代碼,所以每次startDate或clubKey寫入時,我都會更新「sortFiled」,這個小小的變化,就像一個魅力一樣。

原問題 我有一些事件數據。 樣本數據:

{ 
    "modeltruckerManualEventID-96" : { 
    "canceled" : false, 
    "clubKey" : "manualClubKey-1", 
    "endTime" : "17:00:00", 
    "eventOpenForWeightData" : false, 
    "link" : "", 
    "locationID" : "manualLocationID-4", 
    "name" : "Fahrtag TuHaKi", 
    "startDate" : "2012-06-17", 
    "startTime" : "10:00:00" 
    }, 
    "modeltruckerManualEventID-97" : { 
    "canceled" : false, 
    "clubKey" : "manualClubKey-2", 
    "endTime" : "17:00:00", 
    "eventOpenForWeightData" : false, 
    "link" : "", 
    "locationID" : "manualLocationID-4", 
    "name" : "Fahrtag TuHaKi", 
    "startDate" : "2012-06-17", 
    "startTime" : "10:00:00" 
    }, 
    "modeltruckerManualEventID-98" : { 
    "canceled" : false, 
    "clubKey" : "manualClubKey-2", 
    "endTime" : "16:00:00", 
    "eventOpenForWeightData" : false, 
    "link" : "", 
    "locationID" : "manualLocationID-4", 
    "name" : "Fahrtag TuHaKi", 
    "startDate" : "2012-03-11", 
    "startTime" : "10:00:00" 
    }, 
    "modeltruckerManualEventID-99" : { 
    "canceled" : false, 
    "clubKey" : "manualClubKey-1", 
    "endTime" : "16:00:00", 
    "eventOpenForWeightData" : false, 
    "link" : "", 
    "locationID" : "manualLocationID-4", 
    "name" : "Fahrtag TuHaKi", 
    "startDate" : "2011-11-27", 
    "startTime" : "10:00:00" 
    } 
} 

我現在要過濾,所以我只能從一個「clubKey」 事件,我可以實現使用:

.orderByChild("clubKey").equalTo("manualClubKey-1") 

這工作正常。

但是,有什麼辦法,我可以通過孩子「startDate」命令結果嗎?

所以我想要最終按startDate排序過濾的結果。

據我所知,這是行不通的。

我通過Firebase UI在Android上使用Firebase。

任何想法如何實現?我不想重組數據或進一步複製它。

希望有一種方法,也許強制已經存儲的訂單?

+0

你或者可以對數據進行排序的客戶端或創建結合clubKey'的'的值的屬性和'startDate'。例如:''「clubKey_startDate」:「manualClubKey-1_2011-11-27」'。請參閱http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase –

+0

謝謝,但我沒有看到,我如何獲得所有「manualClubKey-1」與任何startDate ,但由startDate命令。 或者有一個使用startAt和endAt的技巧。在鏈接給出我沒有看到我的問題的解決方案,看起來相似。 –

+0

你的問題似乎是如何通過'startDate'命令獲得'club ==「manualClubKey-1的用戶。你需要爲它創建一個複合屬性,然後'ref.orderByChild(「clubKey_startDate」)。startAt(「manualClubKey-1」)。endAt(「manualClubKey-2」)' –

回答

0

如果你想orderByChild(especificdate),不可能重構數據。

但是,假設你想獲得最新添加的節點,只需使用limitToLast(numberOfChildren)