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 がサブ コレクションを取得できないため、追加の db 呼び出しが必要になります。

  2. 大きな問題は、使用可能な属性をアイテムにアタッチする必要があることです。以前はアイテム コレクション レベルで使用できましたが、バリアントができたので、各バリアントに配置する必要があります。親コレクション レベルのバリアント配列にそれがある場合、1 つのアイテムに対して複数の値が存在するため、algolia 検索で使用できるものをフィルタリングすることはできなくなると思います。バリアント サブ コレクションに available を配置すると、Algolia は Items コレクション内のドキュメントのみをインデックス化するため、インデックス化されません。ここに解決策があるかどうかはわかりません。

サブコレクションをまったく持たないことを本当に望んでいます。サブコレクションなしで上記を実行し、すべての一意の属性をバリアント配列にマージするだけでよいと思います。しかし、その場合、バリアントごとに一意の docId を使用することはできず、それが必要であると確信しています (まだ完全にはわかりません)。また、使用可能な属性の問題も修正されません。

これを適切に行う方法について何か考えはありますか?サブコレクションなしでそれを行う方法はありますか?

4

1 に答える 1