Firebase orderByChild(1)并按子二过滤任何解决方案?

时间:2017-05-10 21:30:48

标签: android firebase firebase-realtime-database firebaseui

解决方案: 正如弗兰克已经说过的那样,我必须创建一个单独的文件来进行这种排序。正如所建议的,我创建了一个结合

的字段“sortField”
"clubKey" + "_" + "startDate"

为了修改我现有的数据集,我做了一个像这样的快速java脚本函数:

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);
    });
}

我使用以下代码对此进行了测试:

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排序过滤结果。

据我所知,这不起作用。

我在Android上使用Firebase和Firebase用户界面。

任何想法如何实现?

我不想重组数据或进一步复制数据。

希望有办法,也许强制已经存储的订单?

1 个答案:

答案 0 :(得分:0)

如果您想订购BiChild(特定日期),则无法重组数据。

但是,假设您想获取最新添加的节点,只需使用limitToLast(numberOfChildren)