如果Firebase中存在属性,则获取数据

时间:2018-11-20 15:07:42

标签: javascript firebase firebase-realtime-database

所以我有一个拥有25000个用户的数据库。我需要获取用户的数据,这些数据在他们的帐户中具有某些属性。像这样:

let users = arrayFromObject(await firebase.database().ref('Users')
    .orderByChild('transactions')
    .once('value').then(r => r.val()).catch(e => console.log(e)));
console.log(users);
users = users.filter(u => {
    if (u.transactions) {
        return u;
    }
});
console.log(users);

这有效。但事实证明,只有630位用户说过财产。如何仅获得拥有transactions属性的用户?我在考虑类似orderByChild('transactions').exists()之类的东西,但是据我所知这个功能并不存在。

我如何才能只获取其帐户中具有transactions字段的用户,并在服务器上对其进行过滤?

3 个答案:

答案 0 :(得分:2)

您可以这样做:

let ref = firebase.database().ref("Users");

ref.orderByChild("transaction").on("value", function(snapshot) {
if(snapshot.exists()){
  console.log("the user has the transaction property");
    }
 });

此处快照位于节点Users处,然后使用snapshot.exists(),您将能够检索仅具有transaction属性的所有用户。

您可以将数据库更改为此:

UserTransaction
         john  : true
         peter : true

或这个:

UserTransaction
         userId
           transaction : true
         userId
           trasansaction : true

这样,您只检索具有交易属性的用户

答案 1 :(得分:1)

我想这是您需要重新考虑架构并使用非规范化的地方。这样,您可能根本不必进行查询。

https://www.youtube.com/playlist?list=PLl-K7zZEsYLlP-k-RKFa7RyNPa9_wCH2s

答案 2 :(得分:0)

好,我找到了!这就是我所做的:

const users = arrayFromObject(await firebase.database().ref('Users')
    .orderByChild('transactions').startAt(1).once('value').then(r => r.val()));