Firestore:如何使用不等式/不等于执行查询

and*_*130 39 firebase google-cloud-firestore

我想从Firestore集合中选择仅由我编写的文章.
这真的很难吗?

每篇文章都有字段"owner_uid".

多数民众赞成:
我只想写相当于"select * from articles where uid<>request.auth.uid"

Dou*_*son 44

Firestore不提供不平等检查.根据文件:

where()方法有三个参数:要过滤的字段,比较操作和值.比较可以是<,<=,==,>或> =.

不等式操作不像使用索引的其他操作那样扩展.Firestore索引适用于范围查询.对于这种类型的索引,对于不等式查询,后端仍然必须扫描集合中的每个文档以便得出结果,并且当文档数量变大时,这对性能非常不利.

如果您需要过滤结果以删除特定项目,您仍然可以在本地执行此操作.

您还可以选择使用多个查询来排除不同的值.像这样的东西,如果你想要除了12之外的所有东西.查询值<12,然后查询值> 12,然后在客户端中合并结果.

  • 如此恼人的缺乏基本功能让我很遗憾我选择了Google Firebase作为BaaS (82认同)
  • 在当地,但如何?如果收集"文章"有10万篇文章被我恳求,这意味着我必须在我收到UNreaded文章之前用分页疯狂的数量查询这个集合. (7认同)
  • 这里没有雷区.与任何nosql数据库一样,您必须学习如何以适合您预期查询的方式建模数据. (5认同)
  • 所以我制作了一个用于创建文章的应用程序.当我没有找到如何显示其他用户创建的文章列表的任何解决方案时,我感到很惊讶.本地过滤是百万(只有一个!)文章案例中的废话.^( (3认同)

Jur*_*lja 6

对于 android,使用Task Api应该很容易实现。新手示例:

    FirebaseFirestore db = FirebaseFirestore.getInstance();
    Query lessQuery = db.collection("users").whereLessThan("uid", currentUid);
    Query greaterQuery = db.collection("users").whereGreaterThan("uid", currentUid);
    Task lessQuery Task = firstQuery.get();
    Task greaterQuery = secondQuery.get();

    Task combinedTask = Tasks.whenAllSuccess(lessQuery , greaterQuery)
                             .addOnSuccessListener(new OnSuccessListener<List<Object>>() {
        @Override
        public void onSuccess(List<Object> list) {

            //This is the list of "users" collection without user with currentUid
        }
    });
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用它组合任何一组查询。

对于网络,有rxfire