Firebase 数据库提供了广泛的数据功能管理。一项常见的挑战是根据嵌套子结构中的值查询数据。本指南演示了如何在 Firebase 中高效处理此类查询。
考虑以下表结构:
chats --> randomId -->--> participants -->-->--> 0: 'name1' -->-->--> 1: 'name2' -->--> chatItems
目标是查询“聊天”表来检索包含特定参与者的所有聊天。当前的查询尝试:
subscribeChats(username: string) { return this.af.database.list('chats', { query: { orderByChild: 'participants', equalTo: username, // How to check if participants contain username } }); }
由于 Firebase 中索引固定路径的限制而面临挑战。
1.集合与数组:
最初将参与者存储为数组的数据结构,它允许重复,并且不能反映所需的唯一参与者模型。 Firebase 集合提供了更合适的解决方案,确保每个子项仅存在一次。
participants: { "puf": true }
2.索引反转:
不应将参与者嵌套在聊天中,而应反转结构以创建一个“倒排索引”,根据参与者列出聊天。这可以实现对用户聊天室的高效查询:
userChatrooms: { john: { chatRoom1: true, chatRoom2: true }, puf: { chatRoom1: true, chatRoom3: true } }
现在,以下查询可以检索用户的聊天室:
ref.child("userChatrooms").child("john")
Cloud Firestore 通过其数组包含运算符提供了对此类查询的增强支持,该运算符允许根据其中的值过滤文档数组:
query = collection.where('participants', 'array-contains', username);
这提供了比 Firestore 更简洁、更高效的解决方案。
在 Firebase 中,查询嵌套数据结构需要仔细规划和理解数据结构限制。通过使用集合和倒排索引,并利用 Cloud Firestore 的数组包含运算符,开发人员可以在 Firebase 应用程序中高效处理此类查询。
以上是如何高效查询 Firebase 中包含特定参与者的聊天?的详细内容。更多信息请关注PHP中文网其他相关文章!