【问题标题】:Firebase: query for best match resultsFirebase:查询最佳匹配结果
【发布时间】:2017-07-10 22:31:27
【问题描述】:

我想在 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) 这永远不会给我完全匹配,但我想得到最好的匹配。与该数字接近的值,我该怎么做?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    您可以使用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);
    });
    

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

    【讨论】:

    • 它工作了,现在我有 14 个属性,我想与之匹配的只有一个。我需要索引所有 14 个键吗?查询呢?匹配的值的数量是否有限制?
    【解决方案2】:

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

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

    【讨论】:

    • 不确定 -epsilon 是什么意思。而不是 eplison 我用 -5 +5 做了这样的事情,你知道给它一个范围。我在日志中收到警告。 FIREBASE 警告:使用未指定的索引。考虑将 /People 处的 ".indexOn": "mCalculateLeftEyeSizeWidth" 添加到您的安全规则中以获得更好的性能。我想我需要定义它。
    • epsilon 我的意思是一个小的值来设置一个范围。你用了5个。此警告是为了安全和性能,您可以查看下面的链接以了解更多信息firebase.google.com/docs/database/security/indexing-data
    【解决方案3】:

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

    firebase“方式”是下载整个数据库,然后查询:https://firebase.google.com/docs/reference/js/firebase.database.Reference。它适用于小型数据集,但如果您有数百条记录,或者如果您需要更多功能,我会推荐 MongoDB 或 Parse。

    【讨论】:

    • 没错。我想要的是获得与这些查询匹配的人,这就是我在云端选择 Firebase 的原因:-)
    • 遗憾的是,正如我所提到的,目前(2017 年 7 月)不可能使用 Firebase 进行非常强大的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多