Firebase REST 流是否支持排序和过滤子节点?
Does Firebase REST streaming support ordering and filtering child nodes?
我想将更改流式传输到 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://Whosebug.firebaseio.com/29265457/.json?print=pretty&orderBy="type"&equalTo=1'
在一个单独的终端中,post 一个类型为==1 的新项目:
$ curl -X POST -H "Content-Type: application/json" -d '{"type": 1}' https://Whosebug.firebaseio.com/29265457/.json
{"name":"-JlY1nAmymCKw5lvLvMe"}
这个对象按预期在我正在进行的 curl 流中弹出,因为它匹配 type==1:
的查询
event: patch
data: {"path":"/","data":{"-JlY1nAmymCKw5lvLvMe":{"type":1}}}
现在,这是我误解为 Firebase 忽略查询的部分。如果我 PUT 我刚刚发布的资源并将其更改为 type==0,它仍然会显示在我的流中!要执行 PUT:
$ curl -X PUT -H "Content-Type: application/json" -d '{"type": 0}' https://Whosebug.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 流中看到与我的查询不匹配的更改值?
这里有两点可能是错误的:
- 您没有在
myIndexedField
上定义索引
- 你的 URL 引用不正确
广告 1) 当您通过 (JavaScript/iOS/Java) 库访问 Firebase 时,如果您是 ordering/filtering 未编入索引的数据,它将回退到客户端排序和过滤。鉴于 REST API 没有附带客户端库,它无法执行这样的回退,它只会 return 数据 unordered/unfiltered.
广告 2) 您需要将单引号放在 整个 URL 周围,而不仅仅是查询字符串。一个适合我的卷曲示例:
curl -i -L -H "Accept: text/event-stream" 'https://Whosebug.firebaseio.com/29265457/.json?orderBy="type"&equalTo=0'
我用这个 JavaScript 片段向它推送数据:
new Firebase('https://Whosebug.firebaseio.com/29265457/').push({ type: 0 });
它出现在卷曲中 window;或者如果我将类型设置为 1 则不会。
我想将更改流式传输到 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://Whosebug.firebaseio.com/29265457/.json?print=pretty&orderBy="type"&equalTo=1'
在一个单独的终端中,post 一个类型为==1 的新项目:
$ curl -X POST -H "Content-Type: application/json" -d '{"type": 1}' https://Whosebug.firebaseio.com/29265457/.json
{"name":"-JlY1nAmymCKw5lvLvMe"}
这个对象按预期在我正在进行的 curl 流中弹出,因为它匹配 type==1:
的查询event: patch
data: {"path":"/","data":{"-JlY1nAmymCKw5lvLvMe":{"type":1}}}
现在,这是我误解为 Firebase 忽略查询的部分。如果我 PUT 我刚刚发布的资源并将其更改为 type==0,它仍然会显示在我的流中!要执行 PUT:
$ curl -X PUT -H "Content-Type: application/json" -d '{"type": 0}' https://Whosebug.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 流中看到与我的查询不匹配的更改值?
这里有两点可能是错误的:
- 您没有在
myIndexedField
上定义索引
- 你的 URL 引用不正确
广告 1) 当您通过 (JavaScript/iOS/Java) 库访问 Firebase 时,如果您是 ordering/filtering 未编入索引的数据,它将回退到客户端排序和过滤。鉴于 REST API 没有附带客户端库,它无法执行这样的回退,它只会 return 数据 unordered/unfiltered.
广告 2) 您需要将单引号放在 整个 URL 周围,而不仅仅是查询字符串。一个适合我的卷曲示例:
curl -i -L -H "Accept: text/event-stream" 'https://Whosebug.firebaseio.com/29265457/.json?orderBy="type"&equalTo=0'
我用这个 JavaScript 片段向它推送数据:
new Firebase('https://Whosebug.firebaseio.com/29265457/').push({ type: 0 });
它出现在卷曲中 window;或者如果我将类型设置为 1 则不会。