Firebase Cloud Firestore有多对多关系

时间:2017-10-07 22:19:19

标签: firebase google-cloud-firestore

如何以多对多关系构建和查询Firebase Cloud Firestore中的数据?

我有公司和承包商。承包商可以为多个公司工作,公司可以拥有多个承包商。这是一个简单的多对多关系。我希望能够回答有关公司和承包商的问题:

鉴于一家公司,谁是现有的承包商。 鉴于承包商他们为公司工作的是什么。 在Cloud Firestore中构建数据的正确方法是什么?

2 个答案:

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

您还可以根据需要使用inarray-contains-any运算符。