How do you insert a "reference" value into firestore?

35,196

Solution 1

Probably the simplest solution is to set the value of a reference key to a doc(collection/doc_key) because a DocumentReference is needed.

Example code:

post = {
  content: "content...",
  title: "impressive title",
  user: db.doc('users/' + user_key),
};

db.collection('posts').add(post)

Solution 2

I was trying to figure this out today and the solution I came to was to use the .doc() to create a doc reference

  firebase.firestore()
    .collection("applications")
    .add({
      property: firebase.firestore().doc(`/properties/${propertyId}`),
      ...
    })

This will store a DocumentReference type on the property field so when reading the data you will be able to access the document as so

  firebase.firestore()
    .collection("applications")
    .doc(applicationId)
    .get()
    .then((application) => {
      application.data().property.get().then((property) => { ... })
    })

Solution 3

This is the model class to store in firestore.

import { AngularFirestore, DocumentReference } from '@angular/fire/firestore';

export class FlightLeg {
  date: string;
  type: string;

  fromRef: DocumentReference; // AYT Airport object's KEY in Firestore
  toRef: DocumentReference;   // IST  {key:"IST", name:"Istanbul Ataturk Airport" }
}

I need to store FlightLeg object with reference value. In order to do this:

export class FlightRequestComponent {

  constructor(private srvc:FlightReqService, private db: AngularFirestore) { }

  addFlightLeg() {
    const flightLeg = {
      date: this.flightDate.toLocaleString(),
      type: this.flightRevenue,
      fromRef: this.db.doc('/IATACodeList/' + this.flightFrom).ref,
      toRef: this.db.doc('/IATACodeList/' + this.flightTo).ref,
    } as FlightLeg
    .
    ..
    this.srvc.saveRequest(flightLeg);
  }

The service which can save the object with referenced to another object into firestore:

export class FlightReqService {
   .
   ..
   ...
  saveRequest(request: FlightRequest) {
    this.db.collection(this.collRequest)
           .add(req).then(ref => {
              console.log("Saved object: ", ref)
           })
   .
   ..
   ...
  }
}

Solution 4

The value of the field must be of type DocumentReference. It looks like you're putting some other object in there that has a property called id that's a string.

Share:
35,196
AskYous
Author by

AskYous

I love Islaam, programming, and Rocket League. And swimming and bowling and working out.

Updated on July 09, 2022

Comments

  • AskYous
    AskYous almost 2 years

    I'm trying to insert a document into a collection. I want the document to have a attribute of type reference to insert into the collection. But every time I insert into the collection, it comes out as a string or an object. How can I programmatically insert a reference typed value?

    enter image description here


    It's definitely possible to do it in the UI:

    enter image description here

  • AskYous
    AskYous almost 6 years
    Do I have to implement all those fields and functions?
  • Doug Stevenson
    Doug Stevenson almost 6 years
    When working with the Firestore JavaScript SDK, you naturally work with those objects. Whatever AngularFire does must be wrapping that object. You'll have to get a hold of the underlying DocumentReference.
  • AskYous
    AskYous almost 6 years
    Thanks! I just set the value to the DocumentReference that was returned form a query: i.imgur.com/MIY5HFU.png
  • James A Mohler
    James A Mohler almost 6 years
    @AskYous : that is a useful image. it should be working up into the queston. (with text not an image)
  • AskYous
    AskYous almost 6 years
    @DougStevenson, I now need to perform a where query on a field that's of type reference. Is that possible? If it's complicated, I can make another stackoverflow question.
  • Doug Stevenson
    Doug Stevenson almost 6 years
    If you have a followup question that's different than the first, you should definitely ask it separately.
  • grrigore
    grrigore about 5 years
    You can import DocumentReference like this: import * as firebase from 'firebase/app'; export interface Message { text: string; userReference: firebase.firestore.DocumentReference; }
  • Pat Grady
    Pat Grady almost 5 years
    Great tip. I didn't understand this answer until I realized that Firestore recognizes the reference and applies it automatically. I had thought this suggestion was saying to duplicate the data, I was way off!
  • somedirection
    somedirection about 4 years
    great answer thank you for setting me on the right track.
  • davidbilla
    davidbilla over 3 years
    It only worked after I removed .ref from db.doc('users/' + user_key).ref since db.doc() itself returns a DocumentReference.
  • EngineSense
    EngineSense over 3 years
    is that property field is DocumentReference or String in model?
  • Ruben Szekér
    Ruben Szekér about 3 years
    This doesn't seem to work for me though. I still get the error ERROR FirebaseError: Function addDoc() called with invalid data and if I just set the string it stores, meaning that this object/line of code causes this error. I tried adding .ref to cast it to a DocumentReference but now it doesn't seem to execute at all.
  • Samuel
    Samuel over 2 years
    ".ref" worked for me