每天,我都将外部零售商的产品导入Google Cloud Firestore数据库中。
在此过程中,产品可以是新产品(将新文件添加到数据库中)或现有产品(现有文件将在数据库中更新)。
应该指出的是,我每天要进口大约一千万种产品,因此我不会不在数据库中查询每种产品是否已经存在。
我目前正在使用set with merge,这正是我所需要的,因为它不存在时会创建一个文档或更新现有文档的特定字段。
现在的问题是,鉴于提供的字段将被更新,我如何才能实现createdAt时间戳,因此原始的createdAt时间戳将在更新时丢失?如果该字段已经存在于文档中,有什么方法可以不更新该字段?
答案 0 :(得分:3)
我建议您使用Cloud Function,该函数会在创建Firestore文档时创建一个新的专用字段。更新文档时,您传递给set()
方法的对象中不应包含此字段。
以下是有关Cloud Function代码的建议:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.productsCreatedDate = functions.firestore
.document('products/{productId}')
.onCreate((snap, context) => {
return snap.ref.set(
{
calculatedCreatedAt: admin.firestore.FieldValue.serverTimestamp()
},
{ merge: true }
)
.catch(error => {
console.log(error);
return false;
});
});
基于上面的Bob Snyder评论,请注意,您也可以这样做:
const docCreatedTimestamp = snap.createTime;
return snap.ref.set(
{
calculatedCreatedAt: docCreatedTimestamp
},
{ merge: true }
)
.catch(...)