Вот как я решил эту проблему:
Чтобы установить данные:
const docData = {
listingId: "someExistingId",
jobSeekerId: "anotherExistingId",
otherData: "whatever other data goes here",
}
const docRef = await db.collection("job-application-collection")
.add(docData);
await db.collection(`job-seeker-collection/${docData.jobSeekerId}/applications`)
.add({ref:docRef});
await db.collection(`job-listing-collection/${docData.listingId}/applications`)
.add({ref:docRef});
То есть мы создаем один «настоящий» документ, который помещается в job-application-collection
, а в коллекции JobSeeker и JobListing мы добавляем «документ-указатель», который содержит только одно поле ref
, содержащее ссылка на документ.
Чтобы получить его (в этом примере, получить все приложения для заданного JobSeeker):
const jobSeekerId = "someJobSeekerId";
const colRef = await db.collection(`job-seeker-collection/$jobSeekerId}/applications`);
const colSnapshot = await colRef.get();
/**
* The docs on the collection are actually just documents containing a reference to the actual JobApplication document.
*/
const docsProms = colSnapshot.docs.map((async (colDocData) => {
const snapshot = await colDocData.data().ref.get();
return {
...snapshot.data(),
id: snapshot.id,
}
}));
const data = await Promise.all(docsProms);
return data;
Довольно просто, мы получаем коллекцию в документе JobSeeker, а затем в каждом из этих документов есть поле ref
, которое мы можем использовать метод .get()
для возврата снимка документа.