node.js - 如何在 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 文档中对数组值执行逻辑?
解决方案
我能想到的最简单的解决方案是将这些 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 操作。
推荐阅读
- php - 为什么这个 pdo 获取代码没有给我我想要的
- c - 如何发送进程间消息?
- android - 在 kotlin lambda 中返回时“此处不允许返回”
- docker - Docker for Mac 和 mkdir 权限
- c++ - C++ 二进制读写文件
- ios - 如何在 iPhone 上减少使用 swift 保存的 png 大小?
- javascript - Stripe API - 成功调用 API 后在页面上打印优惠券条款
- javascript - 如何在 SVG 中的两个重叠形状上制作:悬停效果?
- javascript - 如何正确显示阵列?
- javascript - 更改 javascript 时钟中数字的样式