在Firestore中使用类型为"reference"的字段进行查询

jsk*_*dd3 9 javascript firebase google-cloud-firestore

我有一个名为'categories'的集合,其中包含ID为5gF5FqRPvdroRF8isOwd的单个文档.

我有另一个名为'门票'的系列.每个故障单都有一个引用字段,用于将故障单分配给特定类别.

票证集合中的字段称为"类别",字段类型为reference.

在下面的代码中,categoryDocId是我要查询的类别的文档ID.

const categoryDocID = `5gF5FqRPvdroRF8isOwd`;

const files = await firebase
  .firestore()
  .collection('tickets')
  .where('category', '==', categoryDocID)
  .get();
Run Code Online (Sandbox Code Playgroud)

为什么files.length返回0?

为了进行测试,我将category字段类型更改为字符串,并将其设置为类别ID而不是直接引用.这正确地返回了分配给该类别的票证,这使我相信它是关于我如何查询reference字段的.

Ren*_*nec 29

正如你会读到这里的文档,参考数据类型用于存储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();
Run Code Online (Sandbox Code Playgroud)

  • 目前,使用“reference”作为类型几乎没有用。它给您带来的唯一好处是您不会犯诸如引用不存在的文档之类的错误。他们在 Google 频道上讨论了这一点:https://www.youtube.com/watch?v=Elg2zDVIcLo (11认同)
  • 谢谢你回答Renaud.我刚刚在jsbin中证实了这一点:https://jsbin.com/qowelew/4/edit?js,console.我不确定为什么[这个接受的答案](https://stackoverflow.com/47937202)正在使用字符串作为参考. (4认同)

小智 7

对于 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);
Run Code Online (Sandbox Code Playgroud)

  • 这对我很有帮助。谢谢。相信您需要指定要从哪个集合中搜索引用:`const CategoryDocRef = doc(db, '<COLLECTION>', ...)`。 (3认同)