如何根据需求查询?

时间:2021-07-26 18:32:59

标签: firebase google-cloud-firestore database-design

我正在创建一个应用程序,人们可以在其中安排与专业人士的约会。 专业人士在创建帐户时,有时他们想要提供的服务可能需要某些地点的工作许可证/执照。

我一直在尝试在 Firebase Firestore 上创建数据库设计,根据位置和服务类型,我可以获得要求列表(例如工作许可证或保险)。

还值得注意的是,并非所有服务都适用于所有地点。

到目前为止,我的设计如下(括号中的是集合):

(locations)
    United States
        (cities)
            New York
                (categories)
                    Home Improvement
                        (services)
                            House Cleaning
                            - array of licenses/permits required

用户的国家和城市已经知道并存储在用户的个人资料文档中。

我对这一切都很陌生,但即使我能看到这是非常重复的,因为我必须对每个位置都做同样的事情。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

一个包含有关服务的所有详细信息的文档的单个“服务”集合就可以做到这一点。

services -> {serviceID}

服务的文档可能类似于:

{
  serviceID: "service1234",
  category: "Home Improvement",
  location: "United States",
  city: "New York",
  requiredPermits: []
}

现在您可以根据位置、类别或任何其他字段轻松查询服务:

const servicesCol = firebase.firestore().collection("services") 
const servicesInNYC = await servicesCol.where("city", "==", "New York").get()

// for fetching services in multiple cities
await servicesCol.where("city", "in", ["New York", "Washington DC"]).get()

此外,如果服务可以有多个类别,那么您可以在其文档中存储一系列类别,然后像这样获取特定类别:

await servicesCol.where("categories", "array-contains", "Home Improvement")

同样,您可以查询需要特定许可证/许可的服务(确保您在文档的数组中拥有这些服务)。

编辑:如果单个服务可以有多个需要不同许可的位置,那么您可以删除 requiredPermits 字段并将位置移动到子集合,如下所示:

services -> {serviceID} -> locations -> {locationID}

locations 子集合中的每个文档可能如下所示:

{
  country: "United States",
  city: "New York",
  permits: [....]
}

现在您可以查询具有特定许可的服务的位置:

const serviceLocations = await servicesCol.doc("serviceID").collection("locations").where("permits", "array-contains", "permit1ID").get()

// To get services with a specific location/permit
const locationsGroup = firebase.firestore().collectionGroup("locations")
const snap = await locationsGroup.where("permits", "array-contains", "permit1ID").get()