Динамическое добавление фильтров в тело запроса DSL, созданное с использованием bodybuilder.js

Сервер получает массив условий запроса от вызова ajax внешнего интерфейса:

req.query.filterTerms=['black', 'white', 'green']

Мне нужно связать каждый из этих фильтров с запросом культуриста, который:

var body=bodybuilder()
.query('match', 'searchable', req.query.querytext)
.from(i)
.build();

Как динамически связать метод / функцию.filter() для каждого из условий запроса в массиве с экземпляром bodybuilder?

2 ответа

Вы могли бы использовать уменьшить:

    const filterTerms = ['red', 'green', 'black'];
    const body = bodybuilder();
    body.query('match', 'searchable', 'foobar');
    const chainedFilter = filterTerms.reduce((filterBody, term) => {
        return filterBody.filter('match', 'term', term)
    }, body);
    console.log(JSON.stringify(body.build(), null, 2))
<script src="https://rawgit.com/danpaz/bodybuilder/master/browser/bodybuilder.min.js"></script>

Это функциональный эквивалент объединения команд.

Для тех, у кого похожая проблема, попробуйте console.log объекта body, созданного с помощью метода build в экземпляре bodybuilder, после ручной вставки метода filter в экземпляр с параметрами, введенными вами вручную. В нем будет показана структура, которую вы можете использовать добавить к предложениям фильтра культуриста.

Другие вопросы по тегам