【问题标题】:How to structure a firestore collection for items with variants, when using Algolia Search?使用 Algolia Search 时,如何为具有变体的项目构建 firestore 集合?
【发布时间】:2018-03-14 17:24:31
【问题描述】:

正如标题所暗示的那样,我在 Firestore 中有一个如下所示的项目集合:

ParentCollection
    items
        ->docId_1
            ->name: 'Shirt'
            ->price: 5
            ->tags: ['tag1', 'tag2', 'tag3']
            ->attribute1: 'blah'
            ->attribute2: 'blahblah'

但是,我需要这些物品有变体,例如不同的尺寸/颜色/等。在这种结构中,唯一的方法是为每个变体拥有一个全新的项目。这不理想,

这是我目前对要求的看法:

  • 包含所有变体的父项具有唯一的 docId
  • 每个变体都有一个唯一的 docId,但以某种方式附加到父项
  • 通用属性是父项上的字段(名称、公司、标签等)
  • 每个款式都有独特的属性(供货、尺寸/类型、价格)

我目前的计划是这样的:

ParentCollection

    items
        ->parentDocId_1
            ->name: 'Shirt'
            ->variants : [{
                size: S,
                available: true,
                variantDocId: variantDocId_1
                },{
                size: L,
                available: false,
                variantDocId: variantDocId_2
                }]
            ->tags: ['tag1', 'tag2', 'tag3']
            ->attribute1: 'blah'
            ->attribute2: 'blahblah'

                SubCollection
                    variants
                        ->variantDocId_1
                            ->size: 'S'
                            ->price: 5
                            ->parentDocId: parentDocId_1
                        ->variantDocId_2
                            ->size: 'L'
                            ->price: 10
                            ->parentDocId: parentDocId_1

我可以看到这有几个问题。

  1. 这将需要额外的 db 调用,因为 Firestore 在请求父集合时无法获取子集合。

  2. 一个大问题是我需要为项目附加一个可用属性,以前我在项目集合级别拥有它,但现在我有变体,我需要将它放在每个变体上。如果我在父集合级别的变量数组中有它,我认为我不能再过滤 algolia 搜索中的可用值,因为一个项目会有多个值。如果我把可用的变量放在子集合中,那么它不会被 algolia 索引,因为它只是索引 Items 集合中的文档。不知道这里有什么解决方案。

我真的不希望有子集合,我想我可以在没有子集合的情况下执行上述操作,只需将所有唯一属性合并到变量数组中。但是我不会为每个变体都有一个唯一的 docId,而且我很确定我需要它(还不完全确定)。它也不能解决我的可用属性问题。

关于如何正确执行此操作的任何想法?有没有办法在没有子集合的情况下做到这一点?

【问题讨论】:

    标签: google-cloud-firestore algolia react-instantsearch


    【解决方案1】:

    事实证明,这个问题的解决方案更多的是使用 algolia 搜索而不是 firestore。为了实现我想要的,我可以让我的 firestore 数据库非常接近它原来的样子(不需要子集合),我只需要添加一个对象数组,其中包含每个变体独有的信息(variants: [])作为以及将各个文档作为彼此的变体绑定在一起的标识符(distinct: 12345)。

    这里的关键是 aloglia 的 distinct 功能,它允许对由特定键绑定在一起的项目进行重复数据删除。因此,在下面的示例中,我通过 distinct: 12345 字段将 Shirt 项目的三个变体联系在一起。您必须进入 aloglia 仪表板才能打开 distinct 并设置键名。现在搜索时只会显示其中一个变体(这取决于自定义排名或过滤器),但我可以通过变体字段访问所有变体的信息。这使我可以为每个变体拥有唯一的 ID,并且每个变体的所有属性都可以在 algolia 搜索中过滤。它还允许我构建一个选择下拉列表来选择用户想要与之交互的变体。一个警告是添加了冗余,并且在更新项目变体时,将需要云功能来将更改传播到所有变体。但它有效并且问题解决了!

    ParentCollection
        items
            ->docId_1
                ->name: 'Shirt,
                ->tags: ['tag1', 'tag2', 'tag3']
                ->attribute1: 'blah'
                ->attribute2: 'blahblah'
                ->distinct: 12345
                ->variants: [
                    {
                     size: 'S',
                     available: true,
                     price: 5, 
                     docId: docId_1
                    },
                    {
                     size: 'M',
                     available: false,
                     price: 10,
                     docId: docId_2
                    },
                    {
                     size: 'L',
                     available: true,
                     price: 15, 
                     docId: docId_3
                    }]
            ->docId_2
                ->name: 'Shirt'
                ->tags: ['tag1', 'tag2', 'tag3']
                ->attribute1: 'blah'
                ->attribute2: 'blahblah'
                ->distinct: 12345
                ->variants: [
                    {
                     size: 'S',
                     available: true,
                     price: 5, 
                     docId: docId_1
                    },
                    {
                     size: 'M',
                     available: false,
                     price: 10,
                     docId: docId_2
                    },
                    {
                     size: 'L',
                     available: true,
                     price: 15, 
                     docId: docId_3
                    }]
            ->docId_3
                ->name: 'Shirt'
                ->tags: ['tag1', 'tag2', 'tag3']
                ->attribute1: 'blah'
                ->attribute2: 'blahblah'
                ->distinct: 12345
                ->variants: [
                    {
                     size: 'S',
                     available: true,
                     price: 5, 
                     docId: docId_1
                    },
                    {
                     size: 'M',
                     available: false,
                     price: 10,
                     docId: docId_2
                    },
                    {
                     size: 'L',
                     available: true,
                     price: 15, 
                     docId: docId_3
                    }]
    

    【讨论】:

      猜你喜欢
      • 2022-11-26
      • 1970-01-01
      • 2016-04-25
      • 2020-04-07
      • 2020-07-01
      • 2018-03-29
      • 2012-03-25
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多