У меня есть такая структура данных:
{
_id: 'aero',
mobile: '646-444-6666',
mail: 'aero@aero.wang'
'service-name-1': ['type1', 'type2', 'type3'],
'service-name-2': ['type1', 'type2'],
'service-name-3': ['type2', 'type3']
}
Моя цель - запланировать задания на основе имени и типа службы и отправить результат на почту пользователя и мобильный телефон. Проблема заключается в том, что несколько пользователей могут иметь одинаковые имя и тип службы, и я хотел бы запустить только одно задание расписания и уведомить всех пользователей.
Итак, я придумал решение как таковое:
const client = require('./lib/esclient');
const schedule = require('node-schedule')
schedule.scheduleJob('0 0 * * *', () => {
const fields = await client.search({
index: 'docs',
body: {
aggs: {
// aggregate existing fileds
}
}
});
const filedsAndTypes = await client.search({
index: 'docs',
body: {
aggs: {
// based on fields and aggregate fields and type and users who should be notified
}
}
});
const notifyTheUsers = async fieldsAndTypes => {
for (let fieldAndtype in fieldsAndTypes) {
const result = await doTheJob(fieldAndtype);
const listOfUsers = fieldsAndTypes[fieldAndtype];
email(listOfUsers, result);
for (let user of listOfUsers) {
sms(user, result);
}
}
}
});
Очевидно, псевдокод выше. *
Проблема в том, что я не могу агрегировать для полей сasticsearch (также мне нужно иметь возможность получать только те поля, которые существуют в любом из документов, один пользователь можетбудьте единственным пользователем, который скажет «service-one», и он может отказаться от подписки на услугу, поэтому оставив «service-one» полностью отписавшимся, в этом случае altho service-one поле было определено, и я не хотел бы, чтобы оно получалось в результате).
Также, если это действительно невозможно. Не стесняйтесь предлагать новые структуры данных, которые будут соответствовать моей цели.