同一字段的firebase中有多个“==”运算符

hwamh0ep  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(113)

我知道这个标题听起来像是我应该使用in操作符。但是如果firebase在一个查询中没有超过一个in的限制,情况就会是这样。
我正在开发一个简单的一对一消息传递Web应用程序,其中包含我所有的聊天记录。每个文档都代表一条消息。下面是一个文档中的数据结构

{
  "content": "hello",
  "sender": "sender ID",
  "receiver": "receiver ID",
  "timestamp": "SOME TIMESTAMP"
}

因此,我希望检索我(登录用户)所在位置为senderreceiver且我当前打开的聊天为senderreceiver的所有文档
如果firebase允许在一个查询中使用两个in,那么我的目标可以通过以下方式实现:

query(
      chatsRef,
      where("sender", "in", [myID, partnerID]),
      where("receiver", "in", [myID, partnerID]),
      orderBy("timestamp")
    )

在MySQL中,代码如下所示:

SELECT * FROM messages
    WHERE (sender = {$myID} AND receiver = {$partnerID})
    OR (sender = {$partnerID} AND receiver = {$myID}) ORDER BY timestamp)

Firebase声称in操作符是逻辑ORnot-in是逻辑AND,但不允许我们在单个查询中合并它们,这从我的观点来看很奇怪
但是,我尝试过在一个查询中为同一个字段组合多个==运算符,但是这个方法也不起作用。

query(
      chatsRef,
      where("sender", "==", myID),
      where("receiver", "==", partnerID),
      where("sender", "==", partnerID),
      where("receiver", "==", myID),
      orderBy("timestamp")
    )

所以如果有人能提出任何解决方案,我将不胜感激。即使它需要重新组织我的数据(只要它不溢出我的单个文档大小,我可以足够有效地使用firebase的快照功能)
[NOTE:我使用的是ReactJS;在重要情况下]

dy1byipe

dy1byipe1#

您的SQL查询在多个字段之间执行OR条件,这在Firestore中目前是不可能的,因此无法将该查询Map到Firestore。
inMap(即使Firestore允许两个字段上的in)是不同的,因为它还允许SQL不允许的组合:sender == {$myID} AND receiver == {$myID}sender == {$partnerID} AND receiver == {$partnerID}中的一个或多个。
您的最后一个查询在所有条件下执行和AND,这将永远不会匹配任何结果,因为单个字段永远不可能同时等于匹配两个不同的值。
我通常做的是在文档中添加一个额外的字段,以可靠的顺序(即按字母顺序)记录参与者的UID。例如,如果我们是参与者,我们的UID是PratikFrank

participantsUIDs: "Frank_Pratik"

此字段中UID的顺序是按字母顺序排列的,因此无论谁发送和接收消息,该值始终相同。
因此,与senderreceiver字段不同,该字段丢失了参与者角色的信息,但它确实将它们置于可预测的顺序中,这意味着您也可以可靠地查询具有两个特定参与者的文档。
您也可以为参与者使用数组字段,只要您也确保项目的顺序是可预测的即可:

participants: ["Frank", "Pratik"]

在这样的字段上,您也可以使用==运算符,只要您以相同的顺序传入完全相同的值。

相关问题