gpt4 book ai didi

javascript - 按 lastModified 过滤集合

转载 作者:行者123 更新时间:2023-11-30 20:44:43 26 4
gpt4 key购买 nike

我需要在一段时间后修改 Firestore 集合中的文档子集。我试过这些方法:

  • 看来native filtering只能与存储文档中的某些真实字段一起使用 - 即尽管如此,Firestore API 内部有 DocumentSnapshot.getUpdateTime()我无法在查询中使用此信息。

  • 我尝试通过服务器端 firestore 云函数添加我的 _lastModifiedAt“服务字段”,但是...... _lastModifiedAt 的更新导致递归调用 onWrite()功能。 IE。 is 也无法按需工作(递归最终停止并显示 Error: quota exceeded (Function invocations : per 100 seconds))。

是否有其他想法如何通过“lastModifiedTime”过滤集合?


这是我的“云函数”,供引用

  • 如果我能识别出谁在修改文档,即忽略自己对 _lastModified 字段的更新,它会起作用,但我看不出有什么方法可以检查这一点
  • _lastModifiedBy 设置为空,因为 Firestore 当前无法提供 auth 信息(参见 here)

exports.updateLastModifiedBy = functions.firestore.document('/{collId}/{documentId}').onWrite(event => {
console.log(event.data.data());
var lastModified = {
_lastModifiedBy: null,
_lastModifiedAt: now
}
return event.data.ref.set(lastModified, {merge: true});
});

最佳答案

我找到了在更新“_lastModifiedAt”时防止递归的方法。

注意:如果客户端也可以更新“_lastModifiedAt”,这将无法可靠地工作。这在我的环境中并不重要,但在一般情况下,我认为写入“_lastModifiedAt”应该只允许服务帐户。

exports.updateLastModifiedBy = functions.firestore.document('/{collId}/{documentId}').onWrite(event => {
var doc = event.data.data();
var prevDoc = event.data.previous.data();

if( doc && prevDoc && (doc._lastModifiedAt != prevDoc._lastModifiedAt) )
// this is my own change
return 0;

var lastModified = getLastModified(event);

return event.data.ref.set(lastModified, {merge: true});
});

更新:警告 - 在 onWrite() 事件中更新 lastModified 会在尝试删除 Firebase 控制台中的所有文档时导致无限递归。发生这种情况是因为 onWrite() 也会为 delete 触发,并且将 lastModified 写入已删除的文档实际上会复活它。该文档传播回控制台并尝试再次无限期地删除(直到 WEB 页面关闭)。

要解决上述问题,必须为 onCreate()onUpdate() 单独指定代码。

关于javascript - 按 lastModified 过滤集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48843854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com