如何根据Firebase中的多个条件进行查询?

时间:2015-06-04 21:55:58

标签: javascript firebase firebase-realtime-database

我有以下结构:

{
  "users" : {
    "123" : {
      "activities" : {
        "horse" : "horse",
        "bike" : "bike"
      },
      "age" : 21
    },
    "124" : {
      "activities" : {
        "bike" : "bike"
      },
      "age" : 30
  }
}

我正在尝试做类似的事情:

SELECT * FROM users WHERE (activities = 'horse' OR activities = 'bike') AND age >= 21

我可以请一点指点吗?如果我没有正确构建数据,我是否也可以获得一些提示?

编辑:jsfiddle

1 个答案:

答案 0 :(得分:2)

我会将此问题标记为重复,但此代码可能对您开始构建自己的搜索索引有所帮助:

var ref = new Firebase('https://yours.firebaseio.com/users');
var index = new Firebase('https://yours.firebaseio.com/index');
function createIndex() {
    ref.once('value', function(snapshot) {
        snapshot.forEach(function(userSnapshot) {
            var user = userSnapshot.val();
            index.child(user.age).child(userSnapshot.key()).set(true);
            Object.keys(user.activities).forEach(function(activity) {
                index.child(activity).child(userSnapshot.key()).set(true);
            });
        });
    });
}

由于您要搜索所有用户,代码会循环遍历所有用户(通常应在添加或修改用户时执行此操作,因此通过侦听child_事件)。然后将相关节点添加到索引中:一个用于年龄,一个用于每个类别。

在您的数据上运行此操作后,index节点如下所示:

{
  "21": {"123":true},
  "30":{"124":true},
  "bike":{"124":true},
  "horse":{"123":true}
}

因此,您可以通过以下方式获得20到30之间的所有用户:

ref.startAt("20").endAt("30").on('child_added'

或所有具有“马”活动的用户:

ref.equalTo("horse").on('child_added'