首页 > 解决方案 > 数组内不允许使用 Firebase Firestore 时间戳

问题描述

我有一个如下所示的 Firestore 数据模型

board :{
  id: string,
  name: string,
  cratedAt: Timestamp,
  updatedAt: Timestamp,
  owner: string,
  columns: [{
    name: string,
    createdAt: Timestamp,
    updatedAt: Timestamp,
  }]

问题是我无法在数组中添加时间戳,因为它不受 firebase 支持。所以我的选择是使用单独的根集合并将 id 存储在“列”数组中或使用子集合。但这不会增加读取次数,从而增加我的整体交易的价格/账单吗?我该如何避免这种情况?

标签: firebasegoogle-cloud-firestore

解决方案


实际上,不可能firebase.firestore.FieldValue.serverTimestamp()在数组内添加时间戳。有关不可能的原因的更多详细信息,请参见此处。通常的解决方法是将 Array 更改为 Map。

但是云函数还有另一种可能的解决方法:

由于您的文档中有两个包含时间戳 (createdAtupdatedAt) 的字段,因此您可以将这些字段的值(通过 生成FieldValue.serverTimestamp())分配给数组元素,并在创建文档时调用云函数。

以下 Cloud Function 代码显示了如何处理columns数组中的一个元素。您可以调整它以覆盖具有多个元素的数组。

exports.updateTimeStampsInArray = functions.firestore
    .document('myCollection/{docId}')
    .onCreate((snap, context) => {

        const newValue = snap.data();
        const createdAt = newValue.createdAt;

        const columnsArray = newValue.columns;

        const newColumnsArray = [];
        newColumnsArray.push({ name: columnsArray[0].name, createdAt: createdAt });

        return snap.ref.update({ columns: newColumnsArray })
    });

您需要按如下方式创建文档:

  db.collection('myCollection')
    .doc('...')
    .set({
      createdAt: firebase.firestore.FieldValue.serverTimestamp(),
      columns: [{ name: 'TheName' }],  
    });

一旦 CF 运行,它将使用createdAtTimestamp 的值填充 Array 元素。


推荐阅读