繁体   English   中英

如何在Firestore中查询数组中的多个项目? (“阵列含有”)

[英]How to query for more than one item in an array in Firestore? (“array-contains”)

我正在使用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”的)。收集( “消息”)。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)

但这不起作用,因为不允许双“array-contains”并抛出错误消息。

对我来说现在最有效的是打两个电话:

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

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

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

它可以工作,但它是一堆代码并且非常低效。

所以我的问题是:

  1. 有一个更好的方法吗?
  2. 怎么做“array-contains”来检查多个项目?
  3. 我有一个participantArray和一个参与者字段,因为我没有弄清楚如何在一个对象数组上做“array-contains”。 有没有办法或者我应该保留这两个领域?

PS:之前,我曾经查询过参与者对象中的对象,如下所示:

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

这是在“array-contains”存在之前查询的建议方法 - 但是当与orderBy结合时,我将不得不为每个用户创建一个索引,这实际上不是一个选项。

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

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

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

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

另一种方法是在文档中包含两个字段,一个用于按字母顺序最低的USer ID(LAUID),另一个用于按字母顺序最高的用户ID(HAUID)。 如果您在客户端上同时拥有两个用户ID,但不知道哪个是哪个,则可以确定哪个Id中的哪一个(UID2)更大,哪个最小(UID1),那么您的查询将在哪里HAUID等于UID2,其中LAUID等于UID1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM