Firebase 中的 OR 查询

IT技术 javascript firebase firebase-realtime-database
2021-03-14 09:07:24

我正在尝试构建一个消息系统。我计划收集消息,然后根据发送方和接收方查询消息。为此,我需要查询例如:由 Bob 发送并由 Tony 接收的所有消息以及由 Tony 发送并由 Bob 接收的所有消息。我很不清楚如何做这个“或”语句。到目前为止,我有

MessageRef.once('value', function(dataSnapshot) {
  console.log(dataSnapshot.val());
});

返回所有消息。然后我可以做一个 forEach 但它似乎不是很有效。大家有什么建议吗?

另外,您对我构建消息系统的模型与例如拥有聊天室的模型有何想法。

谢谢

1个回答

Firebase 目前只能查询单个子属性。因此,如果您想查询多个属性,则必须将它们合二为一:

Messages
  -DFHJ3498ua
    from: Tony
    to: Bob
    from_to: Tony_Bob
    message: "Hello Bob, this is Tony"
  -DFHJ3598uz
    from: Bob
    to: Tony
    from_to: Bob_Tony
    message: "Hello Tony, What can I do for you?"
  -EFHJ3498ua
    from: Tony
    to: Bob
    from_to: Tony_Bob
    message: "Can you help me with this Firebase query?"

然后,您可以使用以下命令查询从 Bob 到 Tony 的消息:

var ref = new Firebase('https://your.firebaseio.com/Messages');
var query = ref.orderByChild('from_to').equalTo('Bob_Tony');
query.on('value', function(snapshot) {
  console.log(snapshot.val()); // all messages from Bob to Tony
});

在类似聊天的应用程序中,您可能需要考虑实际使用发送方-接收方对作为密钥:

Messages
  from_Bob_to_Tony
    -DFHJ3598uz
      from: Bob
      to: Tony
      message: "Hello Tony, What can I do for you?"
  from_Tony_to_Bob
    -DFHJ3498ua
      from: Tony
      to: Bob
      message: "Hello Bob, this is Tony"
    -EFHJ3498ua
      from: Tony
      to: Bob
      message: "Can you help me with this Firebase query?"

使用这种数据结构,您不必运行查询来获取相关消息,而是可以进行直接查找。

var ref = new Firebase('https://your.firebaseio.com/Messages');
var query = ref.child('from_Bob_to_Tony');
query.on('value', function(snapshot) {
  console.log(snapshot.val()); // all messages from Bob to Tony
});
这是两个不同的字段,如果查询是 bob 或 julie 怎么办?
2021-04-21 09:07:24
谢谢:) 快速问题:如果我做发送者-接收者对,我需要做 2 个查询(从 T 到 B 和 B 到 T),将它们组合起来并按时间排序。那么我不应该按人的房间来组织它吗?
2021-05-02 09:07:24
另外,如果我做一个房间系统,我应该有一个房间集合,其中每个项目都有一长串消息,还是应该创建一个引用房间的消息集合?什么是最好的架构?
2021-05-02 09:07:24
如果你想建模聊天室,建模聊天室。如果您希望参与者之间的房间是持久的(这样当同一个人再次开始交谈时,他们会看到他们以前的消息),如果您基于用户名/ID 进行建模,这将是最简单的。但是所有这些都非常广泛,如果不查看所有用例,就不可能为您确定“最佳”答案,而 StackOverflow 不是论坛。只需从看起来正确的事情开始,然后适应新的见解。或者看看firebase.com/tutorial/#session/ztbgh3woflvgithub.com/firebase/firechat
2021-05-04 09:07:24
您的问题是“由托尼发送并由鲍勃接收的消息”,所以这就是我在回答中建模的内容。如果您想要Tony 和 Bob之间的消息,您可以为此建模,例如,在将名称放入密钥之前对其进行排序。所以像“messages_between_Bob_and_Tony”这样的键。
2021-05-15 09:07:24