【发布时间】:2021-05-17 17:28:14
【问题描述】:
我正在尝试运行一个不等式和多个 array-contains 的查询。
为简单起见,我用假想数据简化了数据结构。假设在一个名为grocerie_packages 的集合中,我有很多文档。我希望能够根据包裹的名称、包裹的价格以及其中包含的蔬菜和水果来证明搜索。目前的数据结构如下:
{
price: 10,
contained_fruits: ["apple", "pear", "grape"],
contained_vegetables: ["tomato", "cucumber", "carrot"],
package_name: ["f", "fa", "fam", "fami", "famil", "family", "family_", "family_s", "family_si", "family_siz", "family_size"]
}
一开始,我使用如下代码根据名字进行查询:
.where("package_name", ">=", searchString)
.where("package_name", "<=", searchString + "\uf8ff");
但后来,当我添加按价格查询的功能时,我遇到了以下问题:
查询无效。带有不等式( 或 >=)的所有 where 过滤器必须位于同一字段中。
我通过创建package_name 的子字符串数组解决了这个问题。我使用的代码是这样的:
.where("package_name", "array-contains", package_name_intput)
.where("price", "<", max_price);
我现在遇到的问题是,因为我对查询做了一个array-contains,所以我无法根据包含的蔬菜和水果进行查询。我不想在客户端上进行排序,因为在某些情况下,我可能会返回超过所需的数千个项目。我也不能将三个数组合并为一个,因为我只想返回一个文档,如果它匹配查询的所有条件。例如,在有人要求apple 和carrot 的查询中,我只想返回包含两者的文档。如果它是一个数组,即使在包中只找到一项,它也会返回文档。我只需要为每个蔬菜和水果提供一项(如apple)搜索。
对我来说,运行这样的查询的最佳方式是什么?我正在尝试找到一个解决方案,在该解决方案中,我不会仅仅为了查询 porpuses 而用许多标志填充文档。例如:
{
flags: ["apple_tomato_f", "apple_tomato_fa", "apple_tomato_fam", ] //and so on
}
【问题讨论】:
标签: javascript firebase google-cloud-firestore