【问题标题】:How to query for more than one item in an array in Firestore? ("array-contains")如何在 Firestore 的数组中查询多个项目? (“数组包含”)
【发布时间】:2019-01-31 07:24:02
【问题描述】:

我正在使用 Firestore 和 Javascript (vue.js) 构建一个一对一聊天应用程序。

我有一个对话和一个消息文档定义如下:

.collection("coversation").doc()

conversation: {
  participantsArray: ["id1", "id2"],
  participants: {
    id1: {
      /* details like avatar & name */
    },
    id2: {
      /* details like avatar & name */
    }
  }
}

.collection("coversation").doc("foo").collection("messages").doc()

message: {
  message: "foo"
}

这很好,所以我现在可以像这样查询特定用户的所有对话:

db.collection('conversations').where("participantsArray", "array-contains", userId)

我现在遇到的问题如下:

我想查询一个特定的对话,像这样:

db.collection('conversations')
  .where("participantsArray", "array-contains", userId)
  .where("participantsArray", "array-contains", chatpartnerId)

但这不起作用,因为不允许使用双“数组包含”并引发错误消息。

现在对我有用的是像这样拨打两个电话:

db.collection('conversations')
  .where(`participantsArray`, '==', [userId, chatpartnerId])

db.collection('conversations')
  .where(`participantsArray`, '==', [chatpartnerId, userId])

然后检查这些查询是否返回对话。如果是这样,我使用该对话添加一条消息,否则我创建一个新对话。

它可以工作,但它是一堆代码,效率很低。

所以我的问题是:

  1. 有没有更好的方法来做到这一点?
  2. 如何使用“array-contains”检查多个项目?
  3. 我有一个 participantsArray 和一个 participants 字段,因为我不知道如何对对象数组执行“数组包含”。有没有办法或者我应该保留这两个字段?

PS: 之前,我曾经像这样查询参与者对象中的对象:

db.collection("conversations").where(`participants.${userId}.id`, "==", userId)

这是在“array-contains”存在之前进行查询的建议方法 - 但是当与 orderBy 结合使用时,我必须为每个用户创建一个索引,这不是一个真正的选择。

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    我找到了一种方法来查询单个对话。

    由于我在“participants”对象中有(1)参与者的详细信息和(2)“participantsArray”中的参与者 ID,我可以查询单个对话如下:

    db.collection('conversations')
          .where(`participants.${userId}.id`, "==", userId)
          .where(`participants.${chatPartnerId}.id`, "==", chatPartnerId)
    

    所以我现在很高兴。然而,这三个问题仍然存在,所以如果有人能正确回答他们,他们的答案将非常有价值:)

    【讨论】:

    • 非常感谢,帕斯卡。这似乎确实是要走的路。对于任何感兴趣的人,这个 Firebase 官方视频对于理解数组、地图和子集合以及何时使用其中一个非常有用:youtube.com/watch?v=o7d5Zeic63s
    【解决方案2】:

    另一种方法是在文档中设置两个字段,一个用于按字母顺序排列的最低用户 ID (LAUID),另一个用于按字母顺序排列的最高用户 ID (HAUID)。如果您在客户端上有两个用户 ID,但不知道哪个是哪个,您可以找出两者中哪个 Id 较大 (UID2) 哪个是最小 (UID1) ,那么您的查询将是 HAUID 的位置等于 UID2,其中 LAUID 等于 UID1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2020-12-30
      • 2020-01-08
      • 1970-01-01
      相关资源
      最近更新 更多