首页 > 解决方案 > 如何在 Cloud Firestore 中对数组执行逻辑 AND 复合查询?

问题描述

我有一个集合,其中的文档有一个members包含用户 ID 的数组属性。我需要找到其成员是一对用户 ID 的文档,例如:

在此处输入图像描述

从复合查询的文档中,我可以看到如何制作OR,但我需要AND,因为我需要包含两个用户 ID 的文档(这实际上是使文档独一无二的原因)。文档说

you can include at most one array-contains or array-contains-any clause in a compound query

所以,下面的代码不起作用(我测试过,它实际上返回了一个错误):

const conversation = await firebaseDb.collection(collectionName)
      .where('members', 'array-contains', userId)
      .where('members', 'array-contains', otherUserId)
      .get();

我也试过这个:

const conversation = await firebaseDb.collection(collectionName)
      .where('members', 'array-contains', [userId, otherUserId])
      .get();

但它什么也不返回。

实际上是否可以AND在 Firestore 文档中对数组值执行逻辑?

标签: node.jsfirebasegoogle-cloud-firestore

解决方案


我能想到的最简单的解决方案是将这些 ID 存储到 Map 而不是数组中。所以你的members地图应该是这样的:

members
 |
 --- M1fB...szi1: true
 |
 --- wXam...69A2: true

现在您可以使用以下方法简单地查询:

const conversation = await firebaseDb.collection(collectionName)
  .where('members.' + userId, '==', true)
  .where('members.' + otherUserId, '==', true)
  .get();

这确实是一个 AND 操作。


推荐阅读