如何根据需求查询?

How to query based on requirements?

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

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

还值得注意的是,并非所有地点都提供所有服务。

目前我的设计如下(括号内为合集):

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

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

我对所有这一切都很陌生,但我什至可以看出这是非常重复的,因为我必须对每个位置都做同样的事情。

感谢任何帮助,谢谢!

一个单独的集合“服务”和包含有关服务的每个细节的文档应该做到这一点。

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")

同样,您可以查询需要特定 license/permit 的服务(确保文档中的数组中包含这些服务)。

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

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

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

{
  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()