Firebaseにて親子リレーションをもたせるときDocumentIDをセットします。

それにより、特定のデータを指定して、子モデルの追加が可能です。
(他の方法もありますが、、、)

親が Thought モデルです。
子が Comment モデルです。

まず、基本のおさらい。Firebaseでは、文字列型の、idが自動生成されて、保持しています。
なおこの記事では、理解しやすさを優先して、テーブルというRDBに親しみやすい言葉を利用しています。
ホントは、NoSQLではCollectionと言います。

まず親のThoughtモデル

class Thought {    
    private(set) var username: String!
    private(set) var timestamp: Date!
    private(set) var toughtText: String!
    private(set) var numLikes: Int!
    private(set) var numComments: Int!
    private(set) var documentId: String!
    private(set) var userId: String!
}

このモデルに、データを詰め込みます。
例えばSwiftでは、TableViewで表示することも多いので、配列に詰め込んでみましょう。

thoughts配列に詰め込む例



//QuerySnapshot型の引数を受け取るようにしておく。
 class func parseData(snapshot: QuerySnapshot?) -> [Thought]{

//Thought型の配列のインスタンスを作っておきます。ここに追加します
    var thoughts = [Thought]()

//snapshotがnilで無いことを確認して
        guard let snap = snapshot else { return thoughts }
       
//snapshotのdocumentsにfetchデータが入っています。
        for document in snap.documents{
            let data = document.data()

//user,timestampなどはdocumentsに入っています。
            let username = document[USERNAME] as? String ?? "Anymouse"
            let timestamp = document[TIMESTAMP] as? Date ?? Date()

//numCommentsなど自分で作成したカラムは、1階層したのdataに格納されています。
            let numComments = data[NUM_COMMENTS] as? Int ?? 0
            let numLikes = data[NUM_LIKES] as? Int ?? 0
            let thoghtTxt = data[THOUGHT_TXT] as? String ?? "Anymouse"

//documentIDは document.documentIDで取得できます。ここがポイント!!

let documentId = document.documentID //取得できないときのために、デフォルト値を決めてあげる必要があります。 let userId = document[USER_ID] as? String ?? "" //配列に表示する1データを作ります。 let newThought = Thought(username: username, timestamp: timestamp, thoughtText: thoghtTxt, numLikes: numLikes, numComments: numComments, documentId: documentId, userId: userId) //作成した1つのデータを配列に追加します。 thoughts.append(newThought)

 

ここでセットしたdocumentIDによりThought配下のCommentにアクセス可能

ポイント self.thought.documentIdにて親テーブルを取得した上で、小テーブルをセットする。
ではコードを見てみましょう。



firestore.runTransaction({ (transaction, error) -> Any? in
       //最初にカラのドキュメントをつくり、そこにセットする
      let newCommentRef = self.firestore.collection(THOUGHTS_REF)
          .document(self.thought.documentId)

//ここポイント!!
               .collection(COMMENT_REF).document()
            
            transaction.setData([
                COMMENT_TXT: commentTxt,
                TIMESTAMP: FieldValue.serverTimestamp(),
                USERNAME: self.username,
                USER_ID: Auth.auth().currentUser?.uid ?? "",
                           
            ], forDocument: newCommentRef)

 

idをセットするのは、結構大切な点だと思うのですが、日本語の記事があまりなかったので、書いてみました。
わかりにくい点や、間違っている点がありましたら、お問い合わせより、
連絡いただけますか?
必ず修正するようにいたします。
よろしくおねがいします。