Javascript Firebase实时数据库执行条件查询
我正在使用Express和Firebase实时数据库管理SDK来管理数据库。我需要从登录用户处获取所有状态为“挂起”或“打开”的票证,但我不确定如何获取这些数据,并且在文档中也找不到解决方案。在SQL中,类似于: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 => {
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。现在我将使用第一种方法。