通过 Firestore 中类型为“reference”的字段进行查询

IT技术 javascript node.js firebase google-cloud-platform google-cloud-firestore
2021-03-05 15:18:26

我有一个名为“类别”的集合,其中包含一个 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字段的方式有关。

3个回答

正如你会读到这里的文档,参考数据类型是用于存储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();
@FrankvanPuffelen 感谢您的确认,弗兰克
2021-04-18 15:18:26
这事有进一步更新吗?能够通过引用 id 进行查询才有意义。
2021-05-06 15:18:26
嗨,关于如何在地图字段上查询的任何建议?我的收藏文档结构像这样ibb.co/wKvSmFb
2021-05-08 15:18:26
感谢您回答雷诺。我刚刚在 jsbin 中确认了这一点:jsbin.com/qowelew/4/edit?js,console我不确定为什么这个接受的答案使用字符串作为参考。
2021-05-11 15:18:26
目前,使用referenceas 类型几乎没有用。它给您带来的唯一好处是您不会犯诸如引用不存在的文档之类的错误。他们在他们的谷歌频道上谈到了这个:youtube.com/watch?v=Elg2zDVIcLo
2021-05-16 15:18:26

这是我如何使用引用类型来查询集合(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();
请在stackoverflow.com/questions/68442405/...回答我的疑问提前致谢
2021-05-13 15:18:26

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

Firebase 版本 9更新了The 1st Renaud Tarnec 的回答

const categoryDocRef = doc(db, "categories/5gF5FqRPvdroRF8isOwd");

const q = query(
  collection(db, "tickets"),
  where("category", "==", categoryDocRef)
);

const ticketDocsSnap = await getDocs(q);