在 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”的字段进行查询的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中通过引用传递时会发生啥?

在颤动中通过字符串获取数据

currentuser 如何在flutter中通过fcm向另一个用户发送请求通知?

如何在 Flutter (Dart) 中通过新路由获取子级 StreamProvider 数据

如何在 Firestore (iOS) 中获取对象

js中通过Object.prototype.toString方法----精确判断对象的类型