Добавить ссылку на документ в две разные коллекции - PullRequest
0 голосов
/ 24 апреля 2019

Я создаю простой сайт доски объявлений.

У вас есть JobSeeker , JobListing и JobApplication

И JobSeeker, и JobListing должны иметь коллекцию JobApplications.

Когда JobSeeker подает заявку на работу, я хочу создать документ JobApplication и добавить его как в коллекцию JobSeeker, так и в коллекцию JobListing.

Но это должна быть ссылка на один документ. (т.е. если вы обновляете его в одном месте, оно должно обновляться в другом).

Как мне этого добиться?

Я вижу по этому ответу:

Cloud Firestore множит документ с одинаковой ссылкой

Я могу добавить ссылку как тип данных в Firestore, но я не совсем уверен, какой метод использовать для ее добавления.

т. collection.add метод принимает DocumentData , но я не вижу, как установить это как ссылку?

Скажите, какой синтаксис использовать для:

  1. Создание документа JobApplication
  2. Добавить ссылку на документ в коллекцию.
  3. Получить ссылку на документ из любой коллекции.

1 Ответ

0 голосов
/ 24 апреля 2019

Вот как я решил эту проблему:

Чтобы установить данные:


    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() для возврата снимка документа.

...