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)
})