我正在创建一个应用程序,人们可以在其中安排与专业人士的约会。 专业人士在创建帐户时,有时他们想要提供的服务可能需要某些地点的工作许可证/执照。
我一直在尝试在 Firebase Firestore 上创建数据库设计,根据位置和服务类型,我可以获得要求列表(例如工作许可证或保险)。
还值得注意的是,并非所有服务都适用于所有地点。
到目前为止,我的设计如下(括号中的是集合):
(locations)
United States
(cities)
New York
(categories)
Home Improvement
(services)
House Cleaning
- array of licenses/permits required
用户的国家和城市已经知道并存储在用户的个人资料文档中。
我对这一切都很陌生,但即使我能看到这是非常重复的,因为我必须对每个位置都做同样的事情。
感谢您的帮助!
答案 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()