База данных Firebase в реальном времени выполняет условные запросы - PullRequest
0 голосов
/ 30 марта 2020

Я использую Express и SDK администратора базы данных Firebase в реальном времени для управления базой данных. Мне нужно получить все билеты, статус которых pending или open, от зарегистрированного пользователя, но я не уверен, как получить эти данные, и я не нахожу решение в документации. В SQL будет что-то вроде:

SELECT * 
FROM tickets as t 
INNER JOIN users as u 
WHERE t.owner = u.id
AND (
    status = 'pending' 
    OR status = 'open'
);

На случай, если вам понадобится какой-то код, чтобы понять, о чем я говорю, вот что я уже пробовал:

router.post('/', async (req: Request, res: Response) => {
    const existingRef = database.ref('tickets')
        .orderByChild('owner')
        .equalTo(req.user.key)
        .orderByChild('status')
        .equalTo('open')
        .orderByChild('status')
        .equalTo('pending);
    const existingSnapshot = await existingRef.on('child_added');
    if (existingSnapshot.val() !== null) {
        return res.json(existingSnapshot.val());
    }
}

Предыдущий код вернет билеты, чей статус pending и open, что не имеет смысла, поскольку на тикет должен быть только один статус.

Итак, что должно Я делаю? Заранее спасибо

1 Ответ

1 голос
/ 30 марта 2020

База данных реального времени может запрашивать только одно дочернее поле за раз, поэтому предлагаемый вами запрос не будет работать. Вам нужно будет отфильтровать результаты после их получения, например:

const snap = await database.ref('tickets')
  .orderByChild('user').equalTo(user.uid)
  .once('value');

const out = {};
snap.forEach(t => {
  if (['open','pending'].includes(t.child('status').val())) {
    out[t.key] = t.val();
  }
});

res.json(out);

Возможно, вы захотите использовать вместо этого Cloud Firestore , поскольку он может выполнять более сложные запросы:

firebase.firestore().collection('tickets')
  .where('user','==',user.uid)
  .where('status','in',['open','pending'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...