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