Firebase REST流是否支持排序和筛选子节点



我想将更改流式传输到Firebase位置,但会根据对某个索引的查询过滤结果,比如:

curl -i -L -H "Accept: text/event-stream" https://mydata.firebaseio.com/path.json?'orderBy="myIndexedField"&equalTo="desiredValue"'

我观察到的是,Firebase似乎忽略了我的查询,并继续将所有更改流式传输到该位置,无论它们是否与查询匹配。除了编写代码来执行自己的客户端筛选之外,还有什么方法可以做到这一点吗?

编辑

下面Frank的回答表明Firebase确实尊重您的查询参数。我遇到的问题仍然存在,我只是误解了发生的事情,因为情况变得有点复杂。我在Frank的Firebase中复制了我的问题,他很乐意为这个问题提供一个活生生的例子。

以下是重现我的问题的步骤:

使用约束类型==1:启动流式查询

$ curl -i -L -H "Accept: text/event-stream" 'https://stackoverflow.firebaseio.com/29265457/.json?print=pretty&orderBy="type"&equalTo=1'

在单独的终端中,张贴一个类型为==1:的新项目

$ curl -X POST -H "Content-Type: application/json" -d '{"type": 1}' https://stackoverflow.firebaseio.com/29265457/.json
{"name":"-JlY1nAmymCKw5lvLvMe"}

这个对象如预期的那样弹出在我正在进行的curl流中,因为它匹配类型==1:的查询

event: patch
data: {"path":"/","data":{"-JlY1nAmymCKw5lvLvMe":{"type":1}}}

现在,这是我误解为Firebase忽略查询的部分。如果我放入刚刚发布的资源并将其更改为type==0,它仍然会显示在我的流中!执行PUT:

$ curl -X PUT -H "Content-Type: application/json" -d '{"type": 0}' https://stackoverflow.firebaseio.com/29265457/-JlY1nAmymCKw5lvLvMe.json

以下是我在正在进行的流卷曲中看到的弹出内容:

event: patch
data: {"path":"/","data":{"-JlY1nAmymCKw5lvLvMe":{"type":0}}}

如果我再次将"type"设置为0,它将不再显示在我的curl流终端中。如果我将type设置为1,那么它确实会弹出到我的curl流中(预期)。这是从1->0的转换,在这里我得到了意外事件。

此外,使用PATCH而不是PUT来修改"type"似乎会在curl流中产生相同的行为。

我认为,当我将一个值更改为不再匹配我的查询时,我不会在流中看到它,这是很自然的。然而,看起来可能是在编辑值之前匹配了查询,或者类似的情况。。。我不知道这是如何在Firebase端实现的。

所以我想新的问题是:如何避免在REST流中看到与查询不匹配的更改值?

这里有两件事可能是错误的:

  1. 您没有在myIndexedField上定义索引
  2. 您的URL引用错误

广告1)当您通过(JavaScript/iOS/Java)库访问Firebase时,如果您正在对未编入索引的数据进行排序/筛选,则会返回到客户端排序和筛选。假设REST API没有附带客户端库,它就无法执行这样的回退,只会返回无序/未过滤的数据。

广告2)你需要在整个URL周围加上单引号,而不仅仅是查询字符串。一个对我有用的卷曲示例:

curl -i -L -H "Accept: text/event-stream" 'https://stackoverflow.firebaseio.com/29265457/.json?orderBy="type"&equalTo=0'

我用这个JavaScript片段将数据推送给它:

new Firebase('https://stackoverflow.firebaseio.com/29265457/').push({ type: 0 });

它出现在卷曲的窗口中;或者,如果我将type设置为1,则不会。

最新更新