メッセージを保存するには、pushとsetの2種類があります。
pushを利用すると、下の例でいうと、messageの下に任意のランダムキーが作成され、その中にmessageという変数に格納したデータが保存される。
firebase
.database()
.ref(`favorites/${currentUID}/${messageId}/message`)
.push(message);
任意のランダムキーを作成せず、messageの下に直接保存したいのであれば、setを使います。
firebase
.database()
.ref(`favorites/${currentUID}/${messageId}/message`)
.set(message);
この場合でも、messageという階層が2つできてしまいます。
それは、setは指定したオブジェクト全体を保存するため。
つまりは、messageを
const message = {
uid: currentUID,
text: comment,
time: firebase.database.ServerValue.TIMESTAMP,
で定義した場合、messageはオブジェクトとしてそのまま保存される。
つまりは、realtime databaseでは、messageがサブキーの名称として扱われ、その中に定義されたデータ(uid,text,time)が格納される。
Firebase Realtime DatabaseはJSON構造でデータを保存する仕組みのため、定義したオブジェクトが上の階層のキー、プロパティ名がその下の階層のキーとなり各データが保存される。(日常フォルダを保存している作業を解釈しただけに過ぎない。)
firebase
.database()
.ref(`favorites/${currentUID}/${messageId}`)
.set({
createdAt: firebase.database.ServerValue.TIMESTAMP,
message});
}
このような記述であれば、messageをキーとしてその下に、変数messageで定義した各プロパティ名がサブキーとなり、各値を保存することができる。