多个orderBy in rest api url

时间:2018-05-13 07:04:10

标签: json rest firebase firebase-realtime-database

我现在正在使用RESTful api处理Firebase。我有一个看起来像这样的样本数据

{
  "user1" : {
    "Name" : "John Doe",
    "acctStatus" : "Pending",
    "Liked" : "Y"
  },
  "user2" : {
    "Name" : "Jane Doe",
    "acctStatus" : "Done",
    "Liked" : "Y"
  }
}

所以我要做的是检索acctStatusPendingLiked等于Y的数据。这就是我的api url看起来像

https://firebase.com/user.json?orderBy="acctStatus"&equalTo="Pending"&orderBy="Liked"&equalTo="Y"

然而,当我这样做时,我会检索user1& user2。为什么会这样?

1 个答案:

答案 0 :(得分:2)

您正在尝试链接Firebase中不允许的多个orderBy。这是因为太多查询会以负面方式影响性能,Firebase会强迫您优化数据结构。

所以你可以选择多种选择。查看此帖子,了解实时数据库的可能性:Query based on multiple where clauses in Firebase

我建议你采用这两种方法中的一种。

<强> 1。使用新的Cloud Firestore

Firebase最近推出了新的Cloud Firestore,它基本上是一个基于document的数据库。这使得构建数据变得更加容易,并且您可以链接queries而不会以不良方式影响性能。您可以在此处了解详情:https://firebase.google.com/docs/firestore/use-rest-api

这是关于如何构建query的一些有用的额外资源: Firestore REST API starting query

<强> 2。重组数据库

如果您决定重组数据库,我建议您使用以下结构之一。

将状态添加为节点:

{
  "pending": {
    "user1" : {
      "Name" : "John Doe",
      "Liked" : "Y"
    },
  },
  "done": {
    "user2" : {
      "Name" : "Jane Doe",
      "Liked" : "Y"
    }
  }
}

现在只需将您的请求更改为以下内容:

https://firebase.com/pending.json?orderBy="Liked"&equalTo="Y"

或作为第二个选项,您可以使我们成为这样的组合属性:

{
  "user1" : {
    "Name" : "John Doe",
    "acctStatus" : "Pending",
    "Liked" : "Y",
    "queryProp" : "Pending-Y"
  },
  "user2" : {
    "Name" : "Jane Doe",
    "acctStatus" : "Done",
    "Liked" : "Y",
    "queryProp" : "Done-Y"
  }
}

然后只需按queryProp订购:

https://firebase.com/user.json?orderBy="queryProp"&equalTo="Pending-Y"

组合属性更易于维护,因为如果status更改,则无需移动数据。但请记住,您将始终收到queryProp作为结果的一部分。