如何以多对多关系构建和查询Firebase Cloud Firestore中的数据?
我有公司和承包商。承包商可以为多个公司工作,公司可以拥有多个承包商。这是一个简单的多对多关系。我希望能够回答有关公司和承包商的问题:
鉴于一家公司,谁是现有的承包商。 鉴于承包商他们为公司工作的是什么。 在Cloud Firestore中构建数据的正确方法是什么?
答案 0 :(得分:5)
您可以让Contractors项目包含一个地图字段,该字段具有作为公司密钥的密钥,并且值可以是一个时间戳以帮助订购。 和公司的地图字段与承包商密钥作为关键和一些价值。 当您尝试过滤和排序时,https://firebase.google.com/docs/firestore/solutions/arrays中提到了这种方法......
Contractors
companies
idCompany1: timestamp
idCompany2: timestamp
idCompany3: timestamp
Companies
contractors
idContractor1: timestamp
idContractor2: timestamp
在这种情况下,您可以提出任何疑问,例如这家公司承包商或该承包商的公司。 像这样:
fireStore.collection("Companies").whereField("contractors." + idContractor, isGreaterThan: 0).order(by: "contractors." + idContractor, descending: true)
是的,你必须在任何任务中更新这两个地方
希望这有帮助!
答案 1 :(得分:0)
正如安德烈·利马(AndréLima)在回答中解释的那样,您可以对关系使用数组。但是我认为这两个集合都不需要为用于映射的数组有一个字段。只有一个集合需要一个用于关系数组的字段。
companies: {
contractors: ['contractor_id_1', 'contractor_id_2', 'contractor_id_2']
}
查询时,您可以使用array-contains operator
根据数组值进行过滤。
示例查询(网络):
companiesRef.where("contractors", "array-contains", "contractor_id_1")
您还可以根据需要使用in
和array-contains-any
运算符。