Firebase Firestore中如何在字段间迁移Timestamp且保留类型?
Firestore Timestamp类型复制后丢失类型的解决办法
问题描述
我的Firestore中有一个名为activity的文档,结构如下:
{ duration: { start?: Timestamp, end?: Timestamp } }
我尝试将duration.end的值复制到duration.start,执行了以下代码:
... const activity = (await activityRef.get()).data() const { duration } = activity; duration.start = duration.end await activityRef.update({ duration });
但执行后发现duration.start不再是Timestamp类型,变成了包含seconds和nanoseconds的普通对象:
{ duration: { start: { seconds: Number, nanoseconds: Number, }, end: Timestamp } }
我想知道:
- 如何在字段间迁移Timestamp而不丢失其类型?
- 有没有合适的方法可以避免处理
seconds、nanoseconds对象,且无需重新实例化admin.firestore.Timestamp?
解决办法
方法一:通过字段路径直接更新(推荐)
不需要取出整个duration嵌套对象,直接使用Firestore的字段路径语法单独更新目标字段,这样能完整保留Timestamp的原始类型:
const activityDoc = await activityRef.get(); // 用get方法直接获取文档中的原始Timestamp实例 const endTimestamp = activityDoc.get('duration.end'); await activityRef.update({ 'duration.start': endTimestamp });
这种方式跳过了对整个嵌套对象的修改,直接操作指定字段,从根源上避免了类型序列化问题。
方法二:保留原始Timestamp实例引用更新
如果必须更新整个duration对象,确保直接引用原始的Timestamp实例,避免间接赋值导致的序列化异常:
const activity = (await activityRef.get()).data(); // 创建新的duration对象,直接复用原始的end Timestamp实例 const updatedDuration = { ...activity.duration, start: activity.duration.end }; await activityRef.update({ duration: updatedDuration });
这里的核心是保证start字段的值是未被篡改的Timestamp实例,而非被意外转换后的普通对象。
问题根源
当你通过.data()获取文档数据后,直接修改嵌套对象duration的属性再整体更新时,Firestore会对整个嵌套对象进行深度序列化处理,导致其中的Timestamp实例被拆分为包含seconds和nanoseconds的普通对象。而通过字段路径单独更新或直接传递原始Timestamp实例时,Firestore能正确识别其类型并保存。
内容的提问来源于stack exchange,提问作者akopyl
相关产品推荐
相关产品推荐

