【问题标题】:Using arrays or sub collections?使用数组还是子集合?
【发布时间】:2019-12-28 12:20:48
【问题描述】:

以这种结构为例:

Businesses       (collection)
   business1     (doc)
   business2
   business3
       info            (object)
            location:
            earnings:
       products:       (object  or collection?)
            product1
            product2
            product3   (object)
                name:yy
                price:xx
                likes:3

我正在创建一个businesses 集合,其中每个文档都是一个business,在business 文档中我将有2 个对象-infoproducts

我需要能够:

  1. 阅读business,包括基于业务或产品名称的所有内容(所有产品)
  2. 为企业添加新产品

如果我对每家企业都使用名为productssub-collection,我将无法一次性阅读 info @987654331 @(特定公司名称的所有数据)。

如果我使用名为products 的对象数组(在business 文档中),我将无法查询business 文档,基于productname

这甚至有可能实现吗?

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    如果我对每个企业都使用名为 products 的子集合,我将无法一次性读取信息和产品(特定企业名称的所有数据)。

    使用 Firestore,您无法在单个查询中从顶级和其他集合进行查询。

    如果我使用称为产品的对象数组(在业务文档中),我将无法根据产品名称查询业务文档。

    由于 Firestore 是 NoSQL 数据库,查询中的JOIN 不可用。如果您选择在子集合上使用数组,我建议根据您的需求的复杂性,如果认为有必要,您可能必须对每个项目进行另一次手动查询(例如,显示具有适当公司名称的产品列表或搜索通过产品名称进行业务)。

    选项 1。 如果您希望某项产品专供某个企业使用,您可以执行以下操作:

    businesses (collection)
    - business (object)
    -- id (object identifier)
    
    products
    - product
    -- id
    -- business_id (reference to the business)
    

    选项 2。如果您希望产品被其他企业使用,您可以执行以下操作:

    businesses (collection)
    - business (object)
    -- id (object identifier)
    
    products
    - product
    -- id
    
    businesses_products
    - business_product
    -- id
    -- business_id
    -- product_id
    

    用法

    假设您选择选项1,搜索将是这样的:

    步骤

    1. 搜索产品
    2. products 集合中运行查询
    3. 根据结果检索business_id
    4. business 集合中运行另一个查询

    进一步阅读

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2016-06-28
      • 2013-08-07
      • 1970-01-01
      • 2019-09-02
      • 2016-12-29
      • 1970-01-01
      • 2018-05-18
      • 2022-11-11
      相关资源
      最近更新 更多