我受到火力的限制。我想要实现的是两个数组-包含在一个查询和防火墙不允许这一点,它是限制在一个查询。
我在我的产品集合中有一系列关键字。例如:关键词:['men','men-clothing', 'men-clothing-denim']
我想搜索产品的基础上的关键字数组,如如果用户搜索男性,服装和过滤,通过选择品牌,牛仔。比关键词更频繁地附加,并最终制造了一串‘男人-衣服-品牌-牛仔’。现在我想在我的产品集合中搜索与我使用的关键字相同的地方(‘关键字’,‘数组-包含’,‘男人-服装-品牌-牛仔’)。
问题是,我也有排序我的应用程序,所以如果用户选择‘低到高’,我也希望在应用过滤器的同时对产品进行排序。我是排序产品的基础上,仅关键字。
Firestore不允许在一个查询中包含两个Where数组。当用户申请过滤器时,我也想对我的产品进行排序。
对于排序,我使用where('keywords', 'array-contains', 'men-clothing');
因此,最后,如果我想实现这两个目标,我需要将查询写成:
db.collection('products').where('keywords', 'array-contains', 'men-clothing').where('price', 'desc').where('keywords','array-contains', 'men-clothing-brand-denim').get()而且,firestore不支持两个其中的数组-在同一个查询中包含了使用防火墙实现这一目标的最佳方法。整个场景属于我的电子商务应用程序搜索组件,用户在其中搜索产品,出现一个产品列表,用户可以对产品进行过滤和排序。
发布于 2020-03-02 10:30:52
我想实现的
是两个数组-包含在一个查询中,而Firestore不允许
你完全是对的。如果您将使用多个array-contains,因为会发生以下错误:
由: java.lang.IllegalArgumentException:无效查询引起。查询只支持有一个数组-包含过滤器。
但是,如果您同时需要对men-clothing和men-clothing-brand-denim关键字进行筛选,那么有一个解决办法可以帮助您解决这个问题。正如您已经注意到的,您不能使用array-contains,但是可以对数据库模式的逻辑做一些更改。因此,您应该考虑从keywords数组中为每个单独的值创建一个新属性,然后链接多个where()方法调用。多次调用此方法,它是完全有效的。
您的模式应该如下所示:
keywords: {
"men": true,
"men-clothing": true,
"men-clothing-denim": true
}现在您可以看到,keywords不再是一个数组了,它是一个Map。因此,使用这样的模式,您将能够同时找到与men-clothing和men-clothing-denim匹配的所有文档。需要的查询如下所示:
db.collection('products')
.where("men-clothing", "==", true)
.where("men-clothing-denim", "==", true);您还可以通过所需的属性调用添加订单,但不要忘记创建索引,正如我在下面的文章中解释的那样:
https://stackoverflow.com/questions/60484203
复制相似问题