0

我正在尝试根据两件事来获取我的数据。首先,获取 where isFromCreator = true。其次,根据最新的 10 获取结果。

我的数据库结构如下所示:

ClubContent
     CreatorID
         clubID
            postID: {isFromCreator: Bool}

然后我尝试像这样获取这些内容:

        ref.child("ClubContent").child("jhTFin5npXeOv2fdwHBrTxTdWIi2").child("1622325513718")
        .queryOrdered(byChild: "timestamp")
        .queryLimited(toLast: 10)
        .queryEqual(toValue: true, childKey: "isFromCreator")
        .observeSingleEvent(of: .value, with: { (snapshot) in

然而,返回的结果是一个空快照。出了什么问题?

4

1 回答 1

2

to的第二个参数queryEqual(toValue:)不是要过滤的键,而是所谓的消歧键。因此,如果有多个节点匹配该值,则数据库会找到其键等于的childKey节点并从那里开始返回节点。

因此,如果您想过滤isFromCreator,您将需要:

ref.child("ClubContent").child("jhTFin5npXeOv2fdwHBrTxTdWIi2").child("1622325513718")
    .queryOrdered(byChild: "isFromCreator")
    .queryEqual(toValue: true)

然后,如果有多个isFromCreator等于 的子节点true,您可以通过将其键作为额外值传递给 来确定从哪个开始返回节点.queryEqual(toValue:),例如:

    .queryEqual(toValue: true, childKey: "-Lasdnsa39132...")

您似乎正在尝试对两个属性进行排序/过滤,这在实时数据库中是不可能的。Firebase 数据库查询只能对单个属性进行排序/过滤。

在许多情况下,可以将要过滤的值组合成一个(合成)属性。例如,您可以拥有一个属性:"isFromCreator_timestamp": "true_128348712"并对其进行排序/过滤。

有关此方法和其他方法的另一个示例,请在此处查看我的答案:Query based on multiple where clauses in Firebase

于 2021-06-20T03:50:08.160 回答