我正在使用一个名为Body Builder的查询构建器 我需要构建器根据所选过滤器的数量工作。 因此,特定列表类型的默认过滤器如下所示:
bodybuilder()
.aggregations('terms', 'listingType.keyword', 'Type')
.build()
按预期工作。我有我需要的聚合存储桶。
如果选择了一个项目怎么办?我想添加该过滤器。
这就是我想要的样子:
bodybuilder()
.addFilter('term', 'itemTypeId', 2)
.aggregations('terms', 'listingType.keyword', 'Type')
.build()
或者如果选择了多个项目。
bodybuilder()
.addFilter('term', 'itemTypeId', id)
.addFilter('term', 'moo.keyword', moo)
.addFilter('term', 'make.keyword', make)
.aggregations('terms', 'listingType.keyword', 'Type')
.build()
我有一组选定的过滤器。我想我可以做类似的事情:
const activeFilters = [{type: 'make.keyword, value: 'SAMSUNG'}, {type: 'moo.keyword', value: 'moo'}]
if (activeFilters) {
activeFilters.map(item => {
addFilter(item.type, item.value)
}
}
//OR
bodybuilder()
activeFilters.map(item => addFilter(item.type, item.value)
.aggregation('terms' , 'listingType.keyword', 'Type')
.build()
遵循这些原则。有什么建议吗?
谢谢!
答案 0 :(得分:2)
是的,您可以这样做,可以执行以下操作:
const activeFilters = [{type: 'make.keyword, value: 'SAMSUNG'}, {type: 'moo.keyword', value: 'moo'}];
let query = bodybuilder();
activeFilters.forEach(filter => {
query = query.addFilter('term', filter.type, filter.value);
});
query.aggregation('terms' , 'listingType.keyword', 'Type')
.build()
这个想法是保留对返回值的引用,而不是链接调用。
答案 1 :(得分:1)
在这种情况下,我建议使用reduce
const query = activeFilters.reduce((query, filter) => query.addFilter('term', filter.type, filter.value), bodybuilder())
.aggregation('terms' , 'listingType.keyword', 'Type')
.build();
Titus解决方案存在一个问题-您无法重新分配const
,因此在当前形式下,它很可能行不通。如果要使用他的代码,则需要将query
的变量声明从const
更改为let
。