【问题标题】:How to perform 'OR' queries in the firebase realtime database [duplicate]如何在firebase实时数据库中执行“或”查询[重复]
【发布时间】:2019-08-19 01:22:07
【问题描述】:

我正在创建一个简单的聊天应用程序,我需要一种方法来检索用户的所有消息。我有以下数据结构:

消息{
-LmPsSILmS8c6ph5UoOi {
    格式化时间:“05:43 PM”
    消息:“你好”
    接收器 ID:“GvaD3JOgp5Ro6TWZCa3I7RvK7682”
    senderId:“3BPkGaQq62gnQCbO5UHFIw4XVps2”
}

我想做一个查询,选择 senderId = user.getUid() OR receiverId = user.getUid() 的所有消息

我在互联网上看到过关于 firebase 不这样做的帖子,但必须有办法绕过它,因为我怀疑你是否可以在没有 OR 查询的情况下构建大型应用程序。

我试过了:

 myRef.child("Messages").orderByChild("senderId")
.startAt(user.getId()).endAt(user.getId()).orderByChild("receiverId")
.startAt(user.getId()).endAt(user.getId())
            .addValueEventListener(
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {




                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

这没有奏效,尽管我已经广泛搜索了一个简单的解决方案,但没有得到任何答案。请帮忙

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    很遗憾,Firebase 实时数据库不支持逻辑 OR 查询。这样的查询甚至是下一代 Firebase 数据库 aren't supported by Firestore,这是因为它的 NoSQL 特性。您应该改为创建两个不同的查询。另见this SO answer,其中包含一堆相关参考。

    【讨论】:

      【解决方案2】:

      出于性能原因,Firebase 实时数据库显然存在一些查询限制。到目前为止,还不可能在 firebase 中使用逻辑 OR 进行查询。官方的 firebase documentation 并没有提到任何支持 OR 查询的东西。

      但是,Firebase 的最新数据库 Cloud Firestore 在其doc 中明确说明了限制。仅供参考,虽然不完全相同,但 Cloud Firestore 以与 Firebase 实时数据库几乎相似的方式存储数据,但具有附加功能和新技术。

      Cloud Firestore 不支持逻辑 OR 查询。在这种情况下,您应该为每个 OR 条件创建一个单独的查询,并在您的应用中合并查询结果。

      由于这是一个限制,您不能以更直接的方式做到这一点。但是,Cloud Firestore 文档中已经提到了明显的解决方案。在您的情况下,我假设您正在使用列表来收集消息。或者,无论您使用什么数据结构来存储消息,我猜添加新数据都不会太难。

      因此,创建单独的查询。一旦进行查询,选择senderId = user.getUid() 所在的所有消息并将它们存储到数据结构中。然后,再次进行查询,选择receiverId = user.getUid() 所在的所有消息,并在数据结构中附加来自第二个查询的新数据。我希望你明白我的意图。

      【讨论】:

      • 在代码效率方面似乎有点浪费,但确实有效
      • 考虑到 Firebase 提供的设施,我们可以忽略这个额外的工作。但令人遗憾的是,他们不会在不久的将来实现此功能,因为这对其 NoSQL 特性造成了巨大的性能打击。
      • 执行AND查询的过程是否类似?
      • 您引用的文档是针对 Cloud Firestore 的,而问题是关于 Firebase 实时数据库的。虽然这两个数据库都不支持 OR 查询,但您不能只将文档从一个应用到另一个问题。
      • @FrankvanPuffelen 对不起,功能几乎相同,实时数据库的文档没有明确说明,但实际上是这样,所以我尝试用 firestore 编写。现在,我已经编辑了。
      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多