在 Firestore 中通过类型为“reference”的字段进行查询
Posted
技术标签:
【中文标题】在 Firestore 中通过类型为“reference”的字段进行查询【英文标题】:Querying by a field with type 'reference' in Firestore 【发布时间】:2019-04-08 00:24:24 【问题描述】:我有一个名为“类别”的集合,其中包含一个 ID 为 5gF5FqRPvdroRF8isOwd 的文档。
我还有另一个名为“tickets”的集合。每张工单都有一个参考字段,用于将工单分配给特定类别。
门票集合中的字段称为“类别”,字段类型为reference
。
在下面的代码中,categoryDocId
是我要查询的分类的文档ID。
const categoryDocID = `5gF5FqRPvdroRF8isOwd`;
const files = await firebase
.firestore()
.collection('tickets')
.where('category', '==', categoryDocID)
.get();
为什么files.length
返回 0?
为了测试,我将category
字段类型更改为字符串,并将其设置为类别ID,而不是直接引用。这正确返回了分配给该类别的票证,这让我相信这是关于我如何查询 reference
字段的问题。
【问题讨论】:
这个答案似乎表明这样的查询是可能的:***.com/questions/47937202/…。我看不出你的代码有什么不同,所以它应该和那里一样。 【参考方案1】:正如您将在文档中看到的here,引用数据类型用于存储DocumentReferences。
如果你想在查询中使用它,你不能使用简单的字符串,既不能使用文档的 UID(即'5gF5FqRPvdroRF8isOwd'
),也不能使用存储在字段中的字符串值(即'/categories/5gF5FqRPvdroRF8isOwd'
)。
您必须构建一个 DocumentReference 并在查询中使用它,如下所示:
const categoryDocRef = firebase.firestore()
.collection('categories')
.doc('5gF5FqRPvdroRF8isOwd');
const files = await firebase
.firestore()
.collection('tickets')
.where('category', '==', categoryDocRef)
.get();
【讨论】:
感谢您回答雷诺。我刚刚在 jsbin 中确认了这一点:jsbin.com/qowelew/4/edit?js,console。我不确定为什么this accepted answer 使用字符串作为引用。 @FrankvanPuffelen 感谢您的确认,弗兰克 目前,使用reference
作为类型几乎没用。它唯一增加你的是你不会犯错误,比如引用一个不存在的文档。他们在他们的 Google 频道上讨论过这个问题:youtube.com/watch?v=Elg2zDVIcLo
您好,您有什么建议可以在地图字段上查询吗?我的收藏文档结构是这样的ibb.co/wKvSmFb
这有什么更新吗?能够通过引用 id 进行查询才有意义。【参考方案2】:
使用 Firebase 版本 9(2021 年 12 月更新):
您必须使用 "categories/5gF5FqRPvdroRF8isOwdand" 创建一个文档参考,然后在您的查询中使用它:
import doc, query, collection, where, getDocs from "firebase/firestore";
const categoryDocRef = doc(db, "5gF5FqRPvdroRF8isOwd");
const q = query(
collection(db, "tickets"),
where("category", "==", categoryDocRef)
);
const ticketDocsSnap = await getDocs(q);
【讨论】:
这对我很有帮助。谢谢你。相信您需要指定您打算从哪个集合中搜索参考:const categoryDocRef = doc(db, '<COLLECTION>', ...)
。【参考方案3】:
这是我如何使用引用类型来查询集合(node.js + typescript):
let myCollectionADocument = await admin.firestore().collection("collection_a").doc("documentId").get();
let myCollectionB = await admin.firestore().collection("collection_b").where("collection_a_id", "==", myCollectionADocument.ref).get();
【讨论】:
请在***.com/questions/68442405/…回答我的问题。提前致谢以上是关于在 Firestore 中通过类型为“reference”的字段进行查询的主要内容,如果未能解决你的问题,请参考以下文章
currentuser 如何在flutter中通过fcm向另一个用户发送请求通知?