【问题标题】:Firebase Real time database execute conditional queriesFirebase 实时数据库执行条件查询
【发布时间】:2020-03-30 14:46:20
【问题描述】:

我正在使用 Express 和 Firebase 实时数据库管理 SDK 来管理数据库。我需要从登录用户那里获取状态为pendingopen 的所有票证,但我不确定如何获取这些数据,也没有在文档中找到解决方案。在 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 的票证,这没有意义,因为每个票证应该只有一个状态。

那么,我该怎么办?提前致谢

【问题讨论】:

  • 我认为 firebase 不是最好的解决方案,因为它的查询能力很差。

标签: javascript node.js firebase express firebase-realtime-database


【解决方案1】:

实时数据库一次只能查询一个子字段,因此您提出的查询不起作用。您需要在获取结果后过滤结果,例如:

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'])

【讨论】:

  • 我读到 Firestore 有点晚了,所以我应该更改我的整个代码以迁移到 Firestore。现在我将使用第一种方法。
猜你喜欢
  • 2019-09-29
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多