firebase google或查询支持或任何替代解决方案

时间:2016-06-15 12:30:13

标签: ios firebase kinvey mbaas nosql

我们刚刚开始为我们的新应用程序探索firebase。该应用程序基本上需要用户和群聊之间的聊天。

对于我们正在创建的聊天应用程序: MessageThread(id,User:userA,User:userB,UserGroup:group,Array:deletedBy,...)

主要问题是firebase不支持OR查询和IN查询,我需要在我的用例中使用。例如:

访问用户对话列表的虚拟查询: 获取MessageThread(s)其中(currentUser.id == userA.id)OR(currentUser.id == userB.id)OR(currentUser.id IN group.members)

我遗漏了一些了解Firebase的内容?设计我们的数据库以解决这个问题的另一种替代方法是什么?

1 个答案:

答案 0 :(得分:3)

在NoSQL中,您必须为应用程序想要使用它的方式建模数据。因此,如果您需要用户所属的会话列表,则应将该列表保留在数据库中:

/conversationMessages
    $conversationId
        $messageId
            text: "Hello world"
            sender: "uid of sender"
            name: "name of sender"
/userConversations
   $uid
     $conversationId1: true
     $conversationId2: true

通过这种方式,您可以轻松查找每个用户所属的会话列表,然后为其中一个加载消息。您可能还想为每个对话保留单独的元数据列表:

/conversationMetadata
    $conversationId
        lastUpdated: timestamp (set with ServerValue.TIMESTAMP)
        title: "name of our chat room"

这样,您可以通过加载对话ID然后加载每个对话的元数据来显示用户的对话列表:

var ref = database.ref().child("userConversations").child(auth.uid);
ref.on('child_added', function(conversationKey) {
    var conversationRef = database.ref().child("conversationMetadata").child(conversationKey.key);
    conversationRef.once('value', function(metadataSnapshot) {
      console.log(metadataSnapshot.val());
    });
});

尝试将SQL知识映射到NoSQL数据库会导致难以学习的经验。我强烈建议您阅读relevant section of the Firebase documentation和此article about NoSQL data modeling