我正在使用Firestore存储多个实体的数据。在此示例中,每个文档都是一家公司,其中包含其销售产品的详细信息,并且每个产品都与多个关键字相关联。示例结构:
文档1:
company_name: 'Company 1',
products: [
{
name: 'Green tea',
keywords: ['green tea', 'healthy, 'matcha']
},
{
name: 'Sushi',
keywords: ['sushi', 'rice', 'healthy']
}
]
文档2:
company_name: 'Company 2',
products: [
{
name: 'Apple',
keywords: ['fruit', 'healthy']
},
{
name: 'Cake',
keywords: ['dessert', 'sweet']
}
]
我想搜索出售带有某些关键字的产品的公司。例如,通过搜索关键字healthy
,将同时返回文档Company 1
和Company 2
,因为它们都使用该关键字出售食品。我该如何通过Firestore过滤/搜索来做到这一点?
答案 0 :(得分:2)
现在,您的数据结构化了,因为多个字段数组元素包含要搜索的值,所以不可能有一个查询就可以找到您想要的所有内容。这里的问题是数组。根本不可能搜索数组字段的嵌套内容。
当数组元素需要分别与查询匹配时,它们应改为集合中的单个文档。是的,更多的读写操作,但这也意味着您的查询成为可能。
想象一下,如果您的两个文档没有包含product数组字段,而是每个文档包含一个名为product的子集合,其中每个项目都有一个称为关键字的字段。
companies (collection)
document 1 (doc)
company_name: string field
products (subcollection)
keywords: string array field
这样,您就可以像这样(在JavaScript中)跨所有公司的所有产品进行集合组查询:
db.collectionGroup("products").where("keywords", "array-contains", keyword)
其中keyword
是您要查找的单词。