事实证明,解决这个问题的方法更多的是使用algolia搜索,而不是firestore。为了实现我想要的,我可以让我的firestore数据库非常接近它原来的样子(不需要子集合),我只需要添加一个对象数组,其中包含每个变体特有的信息(
variants: []
)以及将各个文档作为彼此的变体绑定在一起的标识符(
distinct: 12345
)。
这里的钥匙是aloglia的
distinct
允许对由特定键绑定在一起的项目进行重复数据消除的功能。因此,在下面的示例中,我将
Shirt
项目由
不同: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
}]