firebase Firestore:按单据数组中的项目查询

xzlaal3s  于 2023-02-09  发布在  其他
关注(0)|答案(5)|浏览(132)

我有2个收藏**"照片""用户""用户"中的每个文档都有一个或多个带有数组的照片ID**。

photos > 5528c46b > name: "Photo1"
         a1e820eb > name: "Photo2"
         32d410a7 > name: "Photo3"
users > acd02b1d > name: "John", photos: ["5528c46b"]
        67f60ad3 > name: "Tom", photos: ["5528c46b", "32d410a7"]
        7332ec75 > name: "Sara", photos: ["a1e820eb"]
        9f4edcc1 > name: "Anna", photos: ["32d410a7"]

我想获取具有一个或多个特定照片ID的所有用户
有什么办法可以做到吗?

pbwdgjma

pbwdgjma1#

查看亨利的答案,因为我们还没有提供数组包含查询。
不幸的是,还没有,尽管它在我们的路线图上。
同时,您需要使用Map,其形式为:

photos: {
    id1: true
    id2: true
}

现在您可以通过photos.id1 == true过滤找到所有id1的用户。
阅读Firebase文档中有关查询此类集合的详细信息。

v8wbuo2f

v8wbuo2f2#

添加了“array-contains”查询运算符,用于与.where()一起查找数组字段包含特定元素的文档。
https://firebase.google.com/support/release-notes/js 5.3.0

更新@google-cloud/firestore中也提供:https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0
更新2https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html
更新3现在可在管理节点. js SDK v6.0.0 https://github.com/firebase/firebase-admin-node/releases中获得

mwngjboj

mwngjboj3#

这里对答案进行了一些扩展,因为有些人似乎对必须为每个键创建索引感到困惑,Firestore已经为简单查询创建了数据索引,因此您可以执行如下简单查询

documentReference.where('param','==','value').onSnapshot(...)

但是你不能进行复合查询,除非你为这些参数建立索引。2所以你需要索引来完成类似的事情:

documentReference.where('param','==','value').where(..otherparams...).onSnapshot(...)

因此,只要你需要照片的身份证,你可以保存为

usersCollection :                        (a collection)
    uidA:                                (a document)
         photoField:                     (a field value that is a map or object)
            fieldID1 : true              (a property of the photoField)
            fieldID2 : true              (a property of the photoField)
            etc ...

并且您可以简单地查询在其photoField中具有fieldID1的用户,而无需形成任何索引和类似下面的查询。

firestore.doc('usersCollection/uidA').where('photoField.fieldID1','==',true).onSnapshot(...)
fcwjkofz

fcwjkofz4#

截至2019年11月,Firestore现在已经增加了一个“in”查询,根据the announcement article
使用in查询,您可以在一个查询中查询特定字段的多个值(最多10个),方法是传递一个包含所有要搜索的值的列表,Cloud Firestore将匹配字段等于这些值之一的任何文档。

gev0vcfq

gev0vcfq5#

使用Firebase版本9(2021年12月更新):

您可以将**“array-contains”“while()"中的一个照片文档ID一起使用,以获取拥有该文档ID的所有用户**:

import {
  query,
  collection,
  where,
  getDocs
} from "firebase/firestore";

// Here
const q = query(
  collection(db, "users"),
  where("photos", "array-contains", "5528c46b")
);
// Here

const usersDocsSnap = await getDocs(q);

usersDocsSnap .forEach((doc) => {
  console.log(doc.data()); // "John's doc", "Tom's doc"
});

您还可以将**“array-contains-any”一个或多个照片文档ID(在**“while()"中带有数组)一起使用,以获取更多对应的用户

import {
  query,
  collection,
  where,
  getDocs
} from "firebase/firestore";

// Here
const q = query(
  collection(db, "users"),
  where("photos", "array-contains-any", ["5528c46b", "a1e820eb"])
);
// Here

const usersDocsSnap = await getDocs(q);

usersDocsSnap .forEach((doc) => {
  console.log(doc.data()); // "John's doc", "Tom's doc", "Sara's doc"
});

相关问题