2

因此,正如标题所暗示的那样,我在 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. 这将需要额外的数据库调用,因为 Firestore 在请求父集合时无法获取子集合。

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

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

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

4

1 回答 1

0

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

这里的关键是 aloglia 的distinct功能,它允许对由特定密钥绑定在一起的项目进行重复数据删除。因此,在下面的示例中,我将项目的三个变体Shirt通过distinct: 12345场地。您必须进入 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
                }]
于 2018-03-13T17:52:15.750 回答