How do you insert a "reference" value into firestore?
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.
AskYous
I love Islaam, programming, and Rocket League. And swimming and bowling and working out.
Updated on July 09, 2022Comments
-
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 areference
typed value?
It's definitely possible to do it in the UI:
-
AskYous almost 6 yearsDo I have to implement all those fields and functions?
-
Doug Stevenson almost 6 yearsWhen 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 almost 6 yearsThanks! I just set the value to the DocumentReference that was returned form a query: i.imgur.com/MIY5HFU.png
-
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 almost 6 years@DougStevenson, I now need to perform a
where
query on a field that's of typereference
. Is that possible? If it's complicated, I can make another stackoverflow question. -
Doug Stevenson almost 6 yearsIf you have a followup question that's different than the first, you should definitely ask it separately.
-
grrigore about 5 yearsYou can import DocumentReference like this: import * as firebase from 'firebase/app'; export interface Message { text: string; userReference: firebase.firestore.DocumentReference; }
-
Pat Grady almost 5 yearsGreat 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 about 4 yearsgreat answer thank you for setting me on the right track.
-
davidbilla over 3 yearsIt only worked after I removed
.ref
fromdb.doc('users/' + user_key).ref
sincedb.doc()
itself returns aDocumentReference
. -
EngineSense over 3 yearsis that property field is DocumentReference or String in model?
-
Ruben Szekér about 3 yearsThis 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 over 2 years".ref" worked for me