Javascript Firebase实时数据库执行条件查询

Javascript Firebase实时数据库执行条件查询,javascript,node.js,firebase,express,firebase-realtime-database,Javascript,Node.js,Firebase,Express,Firebase Realtime Database,我正在使用Express和Firebase实时数据库管理SDK来管理数据库。我需要从登录用户处获取所有状态为“挂起”或“打开”的票证,但我不确定如何获取这些数据,并且在文档中也找不到解决方案。在SQL中,类似于: const snap = await database.ref('tickets') .orderByChild('user').equalTo(user.uid) .once('value'); const out = {}; snap.forEach(t => {

我正在使用Express和Firebase实时数据库管理SDK来管理数据库。我需要从登录用户处获取所有状态为“挂起”或“打开”的票证,但我不确定如何获取这些数据,并且在文档中也找不到解决方案。在SQL中,类似于:

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);
选择* 从作为t的门票 内部连接用户为u 其中t.owner=u.id 和 状态='pending' 或状态=‘打开’ ; 如果您需要查看一些代码来理解我所说的内容,这就是我迄今为止所尝试的:

router.post'/',异步请求:请求,res:Response=>{ const existingRef=数据库.ref'tickets' .orderByChild“所有者” .equalToreq.user.key .orderByChild“状态” .equalTo'open' .orderByChild“状态” .equalTo'pending; const existingSnapshot=wait existingRef.on'child_added'; 如果存在snapshot.val!==null{ 返回res.jsonexistingSnapshot.val; } } 前面的代码将返回状态为挂起和打开的票据,这没有意义,因为每个票据应该只有一个状态


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

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

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);

您可能想考虑使用,因为它可以做更复杂的查询:

firebase.firestore().collection('tickets')
  .where('user','==',user.uid)
  .where('status','in',['open','pending'])

我认为firebase不是最好的解决方案,因为它的查询能力不好。我读Firestore的时间有点晚,所以我应该修改我的全部代码,以便迁移到Firestore。现在我将使用第一种方法。