{
"movies": {
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson"
},
"movie2": {
"genre": "Horror",
"name": "The Shining",
"lead": "Jack Nicholson"
},
"movie3": {
"genre": "comedy",
"name": "The Mask",
"lead": "Jim Carrey"
}
}
}
我是Firebase的新手 . 如何从 where genre = 'comedy' AND lead = 'Jack Nicholson' 上方的数据中检索结果?
我有什么选择?
4 回答
使用Firebase's new Query API,您可能会尝试这样做:
但正如Firebase的@RobDiMarco在评论中所说:
所以 my code above will not work .
我知道有三种方法可行 .
1.在服务器上过滤最多,在客户端上完成剩下的工作
您可以做的是在服务器上执行一个
orderBy().startAt()./endAt()
,下拉剩余的数据并在客户端的JavaScript代码中对其进行过滤 .2.添加一个属性,该属性组合了您要过滤的值
如果这还不够好,您应该考虑修改/扩展您的数据以允许您的用例 . 例如:您可以将类型导联填充到您刚刚用于此过滤器的单个属性中 .
您实际上是以这种方式构建自己的多列索引,并可以使用以下方法查询它:
大卫东写了一篇library called QueryBase that helps with generating such properties .
您甚至可以进行相对/范围查询,假设您希望允许按类别和年份查询电影 . 您将使用此数据结构:
然后查询90年代的喜剧:
如果您需要过滤的时间超过一年,请务必按降序添加其他日期部分,例如
"comedy_1997-12-25"
. 这样,Firebase对字符串值执行的词典排序将与按时间顺序排列相同 .属性中值的组合可以使用两个以上的值,但是您只能对复合属性中的最后一个值执行范围过滤 .
一个非常特殊的变体由GeoFire library for Firebase实现 . 该库将位置的纬度和经度组合成一个所谓的Geohash,然后可以用于在Firebase上进行实时范围查询 .
3.以编程方式创建自定义索引
另一种方法是在添加新的Query API之前执行我们已经完成的操作:在不同的节点中创建索引:
可能有更多的方法 . 例如,此答案突出显示了另一种树形自定义索引:https://stackoverflow.com/a/34105063
我写了一个个人库,允许您按多个值排序,所有订单都在服务器上完成 .
认识Querybase!
Querybase接收Firebase数据库引用和您要索引的字段数组 . 当您创建新记录时,它将自动处理允许多次查询的密钥的生成 . 需要注意的是,它只支持直接等价(不小于或大于) .
这会奏效 .