База данных Firebase Realtime и HTTP-запросы: сложные запросы по нескольким осям - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть следующий код для извлечения данных с отметками времени в пределах указанных дат и часовых диапазонов:

app.get('/mymeals/filtered', async(req,res) => {
    let dayFrom= req.query.dayFrom;
    let dayTo= req.query.dayTo;
    let hourFrom= req.query.hourFrom;
    let hourTo= req.query.hourTo;
    console.log(`${dayFrom}-${dayTo} ${hourFrom} ${hourTo}`);
    let userId= req.user.uid;
    return await dbroot.ref(`duplicates/${userId}`)
        .orderByKey().startAt(`${dayFrom}`).endAt(`${dayTo}`).once('value').then( (snapshot) => {
            console.log(snapshot.val());
            return snapshot.ref.orderByKey().startAt(`${hourFrom}`).endAt(`${hourTo}`).once('value').then( (s) => {
                console.log(s.val());
                return res.status(200).send(s.val());
            });
        })
});

База данных выглядит следующим образом: enter image description here

То есть для простоты поиска я сначала собираю элементы по дате, затем в пределах даты - по часам. Итак, 12 на изображении выше 12:00PM. Теперь Firebase не позволяет связывать два orderByKey() с, поэтому я пытаюсь выполнить запрос сначала по дате, а затем, учитывая моментальный снимок, пытаюсь перебрать дочерние элементы, используя snapshot.forEach(child), например:

    app.get('/mymeals/filtered', async(req,res) => {
    let dayFrom= req.query.dayFrom;
    let dayTo= req.query.dayTo;
    let hourFrom= req.query.hourFrom;
    let hourTo= req.query.hourTo;
    console.log(`${dayFrom}-${dayTo} ${hourFrom} ${hourTo}`);
    let userId= req.user.uid;
    return await dbroot.ref(`duplicates/${userId}`)
        .orderByKey().startAt(`${dayFrom}`).endAt(`${dayTo}`).once('value').then( (snapshot) => {
            console.log(snapshot.val());
            acc= [];
            snapshot.forEach( (day) => {
                day.forEach((hour) => {
                    console.log("This: " + hour.key);
                    if (hourFrom <= hour.key && hour.key <= hourTo)
                        hour.forEach((meal) => {
                            acc.push(meal.val());
                        });
                });
            });
            return res.status(200).send(acc);
        })
});

У меня вопрос, все еще возможно каким-то образом скомпоновать запросы по двум осям, или подход, подобный второму фрагменту кода, - единственный путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...