(Parse - > Firebase)如何转换此查询?

时间:2016-06-27 09:17:03

标签: parse-platform firebase firebase-realtime-database

我的应用程序中剩下的最后一个查询是为了完成从P​​arse转移它,它似乎是最容易引起麻烦的问题。

这是Parse查询:

let potential_query = UserAccounts.query()!
let excluded_objects = [String]()

for(...) excluded_objects.push(...);

potential_query.whereKey('objectId', notContainedIn: excluded_objects);
potential_query.whereKey('question_count', greaterThan: 2);
potential_query.whereKey('deactivated', equalTo: false);
potential_query.whereKey('discovery_enabled', equalTo: true);
potential_query.whereKey('gender', equalTo: 'MALE');
potential_query.whereKey('age', greaterThan: 18);
potential_query.whereKey('age', lessThan: 23);
potential_query.whereKey('location', nearGeoPoint: ..., withinMiles: 15); // User within 15 miles based on location data.
potential_query.limit = 1;

请注意,提供的值不是静态的,并且会根据经过身份验证的用户进行更改。通过Firebase的文档,似乎没有任何高级查询选项。 objectId将成为Firebase中的uid

这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

[后台:我目前是Firebase团队的后端工程师。我曾经是一名Parse后端工程师,并花了很多时间在应用程序性能上]

Parse API具有更具表现力的查询语言,这是一把双刃剑。您可以自由地编写几乎任何查询,Parse后端将尽力猜测哪些索引可以帮助您做到最好。实际上,去年我和F8共同演示了F8"在Parse"上按比例运行。您可以看到有关查询性能starting at 16:30的一些内容。 TL; DR:只有少数查询运算符可以帮助缩小数据库扫描范围。在您的情况下,最有价值的两个可能是地理查询和年龄查询。标准数据库索引只是不能索引多个不等式(小于/大于)或不等式并对不同的键进行排序。我们可以讨论如何索引多个相等字段+一个不等式,但在以下情况下,相等条件最有效:

  • 您(几乎)总是会在查询中使用这些密钥。如果没有,您需要单独的索引来确定密钥何时成为查询的一部分,何时不是。
  • 你的平等期限大大缩小了结果。例如。忽视不统一的人口统计数据,年龄平等应该大致将结果降低80倍,而性别平等应该只将结果降低2倍。

对于您的特定情况,我会使用GeoFire来构建地理索引,并在年龄查询中使用标准range operators

myRef.orderByChild('age').startAt(18).endAt(23).limit(someGuess)

你需要' someGuess'因为您将要运行客户端的其余查询运算符。如果您的查询存在大量误报,您可以(但不一定要)使用限制。

如果您不知道使用年龄或地理位置扫描是否更快,您可以尝试使用Promise.race