【问题标题】:How to query based on multiple conditions in Firebase?Firebase中如何根据多个条件进行查询?
【发布时间】:2019-11-28 23:14:53
【问题描述】:

我有以下结构:

{
  "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

【问题讨论】:

  • Firebase 查询只能对单个属性进行排序/过滤。在某些情况下,您可能能够将您的条件组合到一个属性中,但这在这里似乎是不可能的。见stackoverflow.com/questions/26700924/…stackoverflow.com/questions/28034092/or-queries-in-firebase/…
  • @FrankvanPuffelen 我查看了您发送的链接,但由于某种原因,我无法使用该代码逻辑。虽然我理解这个想法。 api同时发生了变化或其他什么,但我无法让我的结果正确过滤
  • 随意分享您的代码,最好将其编辑放入您的问题中。一个 jsfiddle 会更好。
  • @FrankvanPuffelen 看我的例子。现在它返回所有。我试过.startAt('letsGame').endAt('letsGame')equalTo('letsGame') 但没有结果
  • 您只能查询一级深度的属性。见stackoverflow.com/questions/29014556/…

标签: javascript firebase firebase-realtime-database


【解决方案1】:

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

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.orderByKey().startAt("20").endAt("30").on('child_added'

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

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

【讨论】:

  • 谢谢弗兰克,会试试的
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 2015-02-10
  • 2015-05-13
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 2017-04-24
  • 2018-05-06
相关资源
最近更新 更多