Firebase:查询最佳匹配结果

时间:2017-07-10 14:22:58

标签: javascript firebase firebase-realtime-database

我想在Firebase数据库上运行查询并获得最佳匹配而不是完全匹配

所以我在代码中有这样的东西。

// Create the ref people in the DataBase
    var people =   admin.database().ref('/People');

people.orderByChild("mCalculateLeftEyeSizeWidth").equalTo(mCalculateLeftEyeSizeWidth()).on("child_added", function(snapshot) {
                        console.log(snapshot.key);
                    });

这个当前查询是完全匹配,我正在处理双值
(例如:14.212670403551895) 这永远不会给我完全匹配,但我希望得到最好的匹配。接近该数字的值,我该怎么做?

3 个答案:

答案 0 :(得分:0)

您可以使用startAt()然后使用limitToFirst(1)来获取具有所请求宽度或更高宽度的第一个节点:

people.orderByChild("mCalculateLeftEyeSizeWidth")
      .startAt(mCalculateLeftEyeSizeWidth())
      .limitToFirst(1)
      .on("child_added", function(snapshot) {
    console.log(snapshot.key);
});

但是永远不会返回宽度小于请求值的项目。为了得到那些你可以完全相反:endAt().limitToLast()

people.orderByChild("mCalculateLeftEyeSizeWidth")
      .endAt(mCalculateLeftEyeSizeWidth())
      .limitToLast(1)
      .on("child_added", function(snapshot) {
    console.log(snapshot.key);
});

我认为没有办法将这两个查询结合起来。

答案 1 :(得分:0)

通过组合Firebase API的startAt()endAt()方法,您可以借助epsilon值限制结果。

people.orderByChild(...).startAt(yourMethod()-epsilon).endAt(yourMethod()+epsilon).on(...);

答案 2 :(得分:0)

如果我正确理解了您的问题,您希望找到具有以mCalculateLeftEyeSizeWidth()值开头的子属性的所有对象。不幸的是,此时Firebase没有太多查询功能。

firebase"方式"是下载整个数据库,并查询:https://firebase.google.com/docs/reference/js/firebase.database.Reference。它适用于小型数据集,但如果您有数百条记录,或者您需要更多功率,我建议使用MongoDB或Parse。