在Firebase中,如何查询最近的10个子节点?

TIM*_*MEX 5 ios firebase

我正在childByAutoId()用来生我的孩子.每个孩子看起来像:

{
    user_id: 1
}
Run Code Online (Sandbox Code Playgroud)

我希望得到最近添加的10个,按时间DESC排序.最简单的方法是什么?

Jay*_*Jay 17

答案是您需要使用一些反向逻辑,并将每个节点中的时间戳键:值对存储为负值.我省略了user_id:1以保持答案更清晰.

这是Firebase结构

"test" : {
    "-KFUR91fso4dEKnm3RIF" : {
      "timestamp" : -1.46081635550362E12
    },
    "-KFUR9YH5QSCTRWEzZLr" : {
      "timestamp" : -1.460816357590991E12
    },
    "-KFURA4H60DbQ1MbrFC1" : {
      "timestamp" : -1.460816359767055E12
    },
    "-KFURAh15i-sWD47RFka" : {
      "timestamp" : -1.460816362311195E12
    },
    "-KFURBHuE7Z5ZvkY9mlS" : {
      "timestamp" : -1.460816364735218E12
    }
  }
Run Code Online (Sandbox Code Playgroud)

以及这是如何写到Firebase的; 我只是使用IBAction按钮来写出几个节点:

let testRef = self.myRootRef.childByAppendingPath("test")

let keyRef = testRef.childByAutoId()

let nodeRef = keyRef.childByAppendingPath("timestamp")

let t1 = Timestamp

nodeRef.setValue( 0 - t1) //note the negative value
Run Code Online (Sandbox Code Playgroud)

和读取它的代码

    let ref = self.myRootRef.childByAppendingPath("test")
    ref.queryOrderedByChild("timestamp").queryLimitedToFirst(3).observeEventType(.ChildAdded, withBlock: { snapshot in
        print("The key: \(snapshot.key)") //the key
    })
Run Code Online (Sandbox Code Playgroud)

我声明了一个小函数来返回当前的时间戳

var Timestamp: NSTimeInterval {
    return NSDate().timeIntervalSince1970 * 1000
}
Run Code Online (Sandbox Code Playgroud)

和输出

The key: -KFURBHuE7Z5ZvkY9mlS
The key: -KFURAh15i-sWD47RFka
The key: -KFURA4H60DbQ1MbrFC1
Run Code Online (Sandbox Code Playgroud)

如您所见,它们的顺序相反.

注意事项:

  1. 将时间戳写为负值
  2. 在阅读时使用.queryLimitedToFirst而不是last.

在这方面,您也可以像往常一样读取数据并将其添加到数组中,然后对数组进行降序排序.这会给客户带来更多的努力,如果你拥有10,000个节点可能不是一个好的解决方案.