Firebase数据的服务器端过滤

时间:2016-08-11 14:35:20

标签: ios swift firebase-realtime-database

我有一个Firebase数据库结构如下:

{
  "listings" : {
    "-KOt8OUGkUphoMyqEXJ2" : {
      "created" : 1470911323208,
      "ends" : 1470911323209,
      "make" : "LONDON TAXIS INT",
      "model" : "TX4 BRONZE",
      "status" : "For Sale",
    },
    "-KOt97_P8sJW7woED4aH" : {
      "created" : 1470911515115,
      "ends" : 1471775515000,
      "make" : "NISSAN",
      "model" : "QASHQAI N-TEC",
      "status" : "For Sale",
    },
    "-KOt_BYYUEaXu_LNvnUv" : {
      "created" : 1470918609414,
      "ends" : 1471782609000,
      "make" : "MAZDA",
      "model" : "3 TS",
      "status" : "For Sale",
    }
  }
}

我使用GeoFire获取给定半径中列表的键。然后我使用observeSingleEventOfType返回键的列表。一切正常。

但是,我想只返回一个列表,如果"结束"时间戳>当前时间。我尝试了以下方法:

geoQueryHandle = geoQuery.observeEventType(.KeyEntered, withBlock: {(key, location) in

        let listingRef = self.ref.child("listings").child(key)
        let now = Int(NSDate().timeIntervalSince1970 * 1000)
        let query = listingRef.queryStartingAtValue(now, childKey: "ends")

        query.observeSingleEventOfType(.Value, withBlock: {snapshot in

            if let listing = Listing(snapshot: snapshot, location: location) {
                //...populate my tableview
            }
        }
})

有人可以告诉我为什么我的查询不起作用吗?

由于

1 个答案:

答案 0 :(得分:0)

Firebase查询将排序/过滤应用于您执行它们的位置的子节点的属性。

queryLocation
  child1
    filterProperty: filterValue
  child2
    filterProperty: filterValue

由于您的listingRef已经指向特定列表,因此您添加的订单/过滤器将应用于更深层次的子节点。

让用例工作的最简单方法似乎只是过滤客户端节点:

let listingRef = self.ref.child("listings").child(key)

query.observeSingleEventOfType(.Value, withBlock: {snapshot in
    if let listing = Listing(snapshot: snapshot, location: location) {
        let now = Int(NSDate().timeIntervalSince1970 * 1000)
        // TODO: exit if snapshot.child("ends").getValue() < now
        //...populate my tableview
    }
}

实现此目标的更复杂但更有效的方法是从Geofire位置删除过期事件。