firebase - 数组内不允许使用 Firebase Firestore 时间戳
问题描述
我有一个如下所示的 Firestore 数据模型
board :{
id: string,
name: string,
cratedAt: Timestamp,
updatedAt: Timestamp,
owner: string,
columns: [{
name: string,
createdAt: Timestamp,
updatedAt: Timestamp,
}]
问题是我无法在数组中添加时间戳,因为它不受 firebase 支持。所以我的选择是使用单独的根集合并将 id 存储在“列”数组中或使用子集合。但这不会增加读取次数,从而增加我的整体交易的价格/账单吗?我该如何避免这种情况?
解决方案
实际上,不可能firebase.firestore.FieldValue.serverTimestamp()
在数组内添加时间戳。有关不可能的原因的更多详细信息,请参见此处。通常的解决方法是将 Array 更改为 Map。
但是云函数还有另一种可能的解决方法:
由于您的文档中有两个包含时间戳 (createdAt
和updatedAt
) 的字段,因此您可以将这些字段的值(通过 生成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 运行,它将使用createdAt
Timestamp 的值填充 Array 元素。
推荐阅读
- python - ping ~ 100,000 台服务器,多线程还是多处理更好?
- python - NetworkX中节点的上下游
- css - 自定义 gollum wiki 的布局
- c# - 当 RequiredFieldValidator 存在于 Bootstrap 模式中时,单击事件上的 Asp 按钮不会触发
- xamarin - MainActivity.OnActivityResult(int, Result, Intent)':在 Xamrine 中找不到合适的方法来覆盖
- algorithm - 为什么 BFS 不能将无向图转换为 DAG?
- python - “ValueError:不支持多类格式” roc_auc_score
- javascript - 将多个 SVG 对齐到环绕元素
- java - JavaFX - 后台线程上的 javafx.beans.property 更新
- google-cloud-platform - 将设备从一个注册表复制到另一个 Google IoT Core