我知道这个标题听起来像是我应该使用in
操作符。但是如果firebase在一个查询中没有超过一个in
的限制,情况就会是这样。
我正在开发一个简单的一对一消息传递Web应用程序,其中包含我所有的聊天记录。每个文档都代表一条消息。下面是一个文档中的数据结构
{
"content": "hello",
"sender": "sender ID",
"receiver": "receiver ID",
"timestamp": "SOME TIMESTAMP"
}
因此,我希望检索我(登录用户)所在位置为sender
或receiver
且我当前打开的聊天为sender
或receiver
的所有文档
如果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
操作符是逻辑OR
,not-in
是逻辑AND
,但不允许我们在单个查询中合并它们,这从我的观点来看很奇怪
但是,我尝试过在一个查询中为同一个字段组合多个==
运算符,但是这个方法也不起作用。
query(
chatsRef,
where("sender", "==", myID),
where("receiver", "==", partnerID),
where("sender", "==", partnerID),
where("receiver", "==", myID),
orderBy("timestamp")
)
所以如果有人能提出任何解决方案,我将不胜感激。即使它需要重新组织我的数据(只要它不溢出我的单个文档大小,我可以足够有效地使用firebase的快照功能)
[NOTE:我使用的是ReactJS;在重要情况下]
1条答案
按热度按时间dy1byipe1#
您的SQL查询在多个字段之间执行OR条件,这在Firestore中目前是不可能的,因此无法将该查询Map到Firestore。
in
Map(即使Firestore允许两个字段上的in
)是不同的,因为它还允许SQL不允许的组合:sender == {$myID} AND receiver == {$myID}
和sender == {$partnerID} AND receiver == {$partnerID}
中的一个或多个。您的最后一个查询在所有条件下执行和
AND
,这将永远不会匹配任何结果,因为单个字段永远不可能同时等于匹配两个不同的值。我通常做的是在文档中添加一个额外的字段,以可靠的顺序(即按字母顺序)记录参与者的UID。例如,如果我们是参与者,我们的UID是
Pratik
和Frank
:此字段中UID的顺序是按字母顺序排列的,因此无论谁发送和接收消息,该值始终相同。
因此,与
sender
和receiver
字段不同,该字段丢失了参与者角色的信息,但它确实将它们置于可预测的顺序中,这意味着您也可以可靠地查询具有两个特定参与者的文档。您也可以为参与者使用数组字段,只要您也确保项目的顺序是可预测的即可:
在这样的字段上,您也可以使用
==
运算符,只要您以相同的顺序传入完全相同的值。