首页 > 解决方案 > 如何获取集合并加入参考字段中的数据?

问题描述

我的目标是收集sales_order并从参考字段中获取额外数据。这是一个问题,因为 1 个 sales_order 文档包含多个参考数据。

有意见的问题:如果你是我,你会尝试实现我想要做的事情,还是更多scalable地将customer名称等数据存储在sales_order文档中以避免过度查询?

销售订单的收款与客户的收款之间的关系

预期响应doc.data()

{
  timestamp,
  expectedDate,
  customer_id: {name, email, street, city, zip, phone}
  user_id, // similar to custoer_id
  refund_policy_id, // similar to customer_id
}

的实际反应doc.data()

{
  timestamp,
  expectedDate,
  customer_id: {_converter, _firestore, _path}
  user_id, // similar to custoer_id
  refund_policy_id, // similar to customer_id
}

我使用与此问题无关的云功能,这是我用来查询集合的基本代码sales_order

firebase
  .firestore()
  .collection("sales_order")
  .get()
  .then((querySnapshot) => {
    let array = [];
    querySnapshot.forEach((doc) => {
      array.push(doc.data());
    });

    return array;
  })
  .catch((error) => console.error(error));

谢谢你。

标签: node.jsfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


根据您共享的内容,您目前拥有以下结构:

sales_order Collection
    id
    customer_id
    refund_policy_id
    timestamp
    expectedDate
    
Customer Collection
    id
    name
    ...
    phone

使用这种结构,如果您需要 Collection 数据,则必须对每个sales_oder文档进行 2 次读取Customer,但是,这种方法的优点是,如果您必须更新Customer数据,则不必每次sales_order完成1 次额外写入Customer以保持数据更新。

以下是一种可以一次性读取所有内容的方法,您可以将文档的副本保存在customer文档的对象内sales_order

sales_order Collection
    id
    customer : {
        CustomerId
        name
        ...
        phone
    }
    refund_policy_id
    timestamp
    expectedDate

Customer Collection
    id
    name
    ...
    phone

由于 Firestore 允许您尽可能多地复制数据,这是一种可行的方法,并且您只能执行 1 次读取以实现您的直接目标,但是,您必须在每次执行时额外进行 1sales_ordercustomer写入更新customer数据。

所以基本上它取决于你想要什么/如何获取customer数据。就我个人而言,我会采用第一种方法,因为在更新数据的情况下易于维护customer数据,因为如果他有很多sales_order,它很容易失控,而且它使代码更简单。

注意:我专注于sales_ordercustomer集合,但同样适用于refund policy.

如果您对此还有任何疑问,请告诉我。


推荐阅读