【问题标题】:In Firebase how does one do a WHERE query with separate ORDER BY在 Firebase 中,如何使用单独的 ORDER BY 进行 WHERE 查询
【发布时间】:2016-02-08 06:21:18
【问题描述】:

使用 firebase 并尝试执行 SQL 中的查询:

`SELECT * FROM definitions WHERE author='joe' ORDER BY votes DESC`

但是,为了在 firebase 中执行 equalTo,您还必须指定您正在订购的特定字段。两者必须相同。真的没有办法做到这一点吗?

【问题讨论】:

标签: javascript firebase


【解决方案1】:

这可以做到 - 有点。

这是一组样本数据

definitions
  -K2XaThTbq3iRnevjM4V
    author: "joe"
    votes: "5"
    sort: "joe_005"
  -K2XaThTbq3iRnevjM4W
    author:  "jay"
    votes: "100"
    sort: "jay_100"
  -K2XaThTbq3iRnevjM4X
    author: "joe"
    votes: "22"
    sort: "joe_022"

ObjC

Firebase *ref = [self.myRootRef childByAppendingPath:@"definitions"];

FQuery *q1 = [ref queryOrderedByChild:@"sort"];
FQuery *q2 = [q1 queryStartingAtValue:@"joe_"];

[q2 observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {

   NSLog(@"%@", snapshot.value);

}];

这将返回所有以 joe 为作者的孩子,按票数排序。

请记住,排序是对字符串值进行排序,因此 joe_5 将排在 joe_22 之后(2 小于 5)。因此,为了补偿,用 0 填充选票,使字符串的数字部分长度相同。

如果是 1000 票,这将失败,所以只需用足够的 0 填充它来补偿。

【讨论】:

  • 这里的问题是你不能轻易地增加排序字段。你必须阅读它,解析它,然后更新它。
  • 最初的问题没有提到增加你的数据,但这并不重要,因为你必须以任何一种方式查询数据。对于我的建议和 SQL 查询,返回的数据将包括作者和投票。不需要解析:取票并增加它,然后将其与名称连接。 name + newVoteCount 并将其写入 Firebase;大概是 8-10 行代码。
  • 在数据库之外增加一个数字本质上是违反数据库最佳实践的。如果两个人同时投票,系统就会失败
  • 在更新值之前在节点中添加一个简单的locked = true 子节点将负责这一点。很酷的是,如果有问题的节点被“锁定”,其他客户端将自动收到通知,并且在它没有被锁定之前不会尝试更新。您还可以利用 Firebase 事务。规则也可以用来避免这个问题。但是,记录锁定和递增超出了原始问题的范围。请就这些主题提出一个新问题,因为有很多很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多