我每天都从外部零售商进口产品到一个Google Cloud Firestore数据库。
在此过程中,产品可以是新的(新文档将添加到数据库中)或现有的(现有文档将在数据库中更新)。
请注意,我每天要导入大约 1000 万件产品,因此我不会查询每个产品的数据库以检查它是否已经存在。
我目前正在使用 set with merge ,这正是我所需要的,因为它会在文档不存在时创建文档或更新现有文档的特定字段。
现在的问题是,如果提供的字段将被更新,我如何才能实现 createdAt 时间戳,因此原始 createdAt 时间戳将在更新时丢失?如果某个字段已存在于文档中,是否有任何方法可以不更新该特定字段?
最佳答案
我建议您使用 Cloud Functions,它会在创建 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(...)
关于database - 在 Firestore 中管理 createdAt 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51656107/