Firestoreはjavascriptのデータをだいたいそのままぶち込んで保存ができるので便利。
だけど、Dateを保存していると、数字型(1528444872883みたいな)や独自の下記Timestamp型になって、読み込み時にエラーになって困った。
このキーだけ、みたいな状況ならTimestampがもってるtoDate()で変換ができるけど、入れ子が深い中にあったり、型を決められないときは全データを回して処理しなきゃいけないので対処がきつい。
今回は深いデータをまるっとバックアップするのが目的だったので保存時に
JSON.stringify(backupData)
して、テキストとして保存し、読み込み時に
JSON.parse(documentSnapshot.data().backupData)
してごまかした。
2018年6月13日追記
入れ子じゃないところでもどこかで変わってしまうらしいので、返ってきたdataのtoDateメソッドがあるかどうかを見て、無かったら文字列だからnew Date()にぶち込むという苦肉の策しか思いつかない。
どこで変更されているのか、または確実にTimestamp型で保存する方法を引き続き調査する。
this.db.collection('path/to/collection') .where('uid', '==', this.user.uid) .orderBy('timestamp', 'desc') .limit(1) .get() .then( function (querySnapshot) { querySnapshot.forEach(function (doc) { if (!doc.exists) { console.log('no backup exists') throw new Error('noBackup') } console.log('doc.data().lastSaveDate', doc.id) if (typeof doc.data().lastSaveDate.toDate !== 'undefined') { app.lastBackupSaveDate = doc.data().lastSaveDate.toDate() } else { console.log('lastSaveDate is String', new Date(doc.data().lastSaveDate)) app.lastBackupSaveDate = new Date(doc.data().lastSaveDate) } }) }).catch(function (e) { console.error(e) })