javascript Firestore OR查询

cmssoen2  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(158)

假设我在Firestore中有一个集合,其中包含以下格式的对象:

{
  /* ... */
  ownerId: "id-1",
  memberIds: [
    "id-2",
    "id-3",
    "id-4"
  ]
}

如何查询Firestore中所有在ownerId字段memberIds字段中存在字符串id-1的文档?
我只找到了AND查询,就像这样:

return collection('whatever')
  .where('memberIds', 'array-contains', 'id-1')
  .where('ownerId', '==', 'id-1');

但是这些只会返回id-1包含在ownerId字段和memberIds数组中的文档。
我知道我可以执行多个查询并连接结果,但这会使分页和排序变得太麻烦。

wj8zmpe1

wj8zmpe11#

在Firestore中不可能执行您所描述的OR查询。
一种解决方案是将数据反规范化(NoSQL世界中非常常见的方法),并向文档添加一个额外的字段,该字段“连接”其他两个字段,如下所示:

{
  /* ... */
  ownerId: "id-1",
  memberIds: [
    "id-2",
    "id-3",
    "id-4"
  ],
  ownersAndMemberIds: [
    "id-1", 
    "id-2",
    "id-3",
    "id-4"
  ]
}

然后,您可以轻松地使用

return collection('whatever')
  .where('ownersAndMemberIds', 'array-contains', 'id-1');

当然,它需要你保持这个数组与其他字段对齐,但这并不难。当你更新两个“主”字段之一时,你可以从你的前端完成它,或者通过一个云函数,它在对文档的任何更改时被触发。

sr4lhrrt

sr4lhrrt2#

Firestore现在支持OR查询(预览版)。您可以从Firebase JS SDK v9.18.0使用它。

const colRef = collection(db, 'whatever')
const q = query(
  colRef,
  or(
    where('memberIds', 'array-contains', 'mem1'),
    where('ownerId', '==', 'mem1')
  )
)

const snapshot = await getDocs(q)
console.log(snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() })))

相关问题