Firestore - 听特定的字段变化?
Posted
技术标签:
【中文标题】Firestore - 听特定的字段变化?【英文标题】:Firestore - Listen to specific field change? 【发布时间】:2018-05-31 07:51:56 【问题描述】:如何使用 firestore js sdk 监听特定字段的变化?
在文档中,他们似乎只展示了如何监听整个文档,如果任何“SF”字段发生变化,都会触发回调。
db.collection("cities").doc("SF")
.onSnapshot(function(doc)
console.log("Current data: ", doc && doc.data());
);
【问题讨论】:
【参考方案1】:你不能。 Firestore 中的所有操作都针对整个文档。
Cloud Functions Firestore triggers 也是如此(您只能收到以某种方式更改的整个文档)。
如果您需要缩小从文档中检索某些数据的范围,请将其放在子集合内的文档中,然后单独查询该文档。
【讨论】:
与 firebase 实时数据库解决方案相比,这不是一个很大的缺点吗? 是的,这是已知的行为差异,并已在各种论坛中讨论过。如果您只想在数据库中找到一个现有的键并监听更改,那么在 RTDB 中这会容易得多。事实上,还有许多其他已知的优势(目前),记录在本博客的末尾:firebase.googleblog.com/2017/10/… 有谁知道他们是否有计划将其作为一项功能?尤其是 Cloud functions.firestore.document().field('myField/subFieldEtc').onUpdate()? @Jim 是的,如果这是您关心的问题,您应该将可以快速更改的字段拆分为不同的文档,这样您就不必支付那些不这样做的成本t. @cjcurrie 仅适用于听众,更改的文档被推送,整个文档随之而来。先前从查询中获得的未更改文档来自内存缓存。这里面没有字段粒度。【参考方案2】:如上所述,整个文档将在您的函数中接收。但是,我创建了一个 filter function,我将其命名为 field
,只是为了在我不感兴趣的字段中发生这些更改时忽略文档更改。
您可以在代码中复制并使用上面链接的函数field
。示例:
export const yourCloudFunction = functions.firestore
.document('/your-path')
.onUpdate(
field('foo', 'REMOVED', (change, context) =>
console.log('Will get here only if foo was removed');
),
);
重要提示: field
函数不会避免在其他字段发生更改时执行您的函数,当更改不是您想要的时它会忽略。如果您的文档太大,您可能应该考虑 Doug 的建议。
【讨论】:
这是一个不错的功能。如果您在我认为的答案中进一步解释它可能会对某些人有所帮助。 你把它翻译成javascript
了吗?
@AlitonOliveira 您可以使用typescriptlang.org/play进行转换【参考方案3】:
收听文档,然后在您感兴趣的字段上设置条件:
firebase.firestore().collection('Dictionaries').doc('Spanish').collection('Words').doc(word).collection('Pronunciations').doc('Castilian-female-IBM').onSnapshot(function(snapshot)
if (snapshot.data().audioFiles) // eliminates an error message
if (snapshot.data().audioFiles.length === 2)
audioFilesReady++;
if (audioFilesReady === 3)
$scope.showNextWord();
, function(error)
console.error(error);
);
我正在收听语音文档 (Castilian-female-IBM
),其中包含 webm
和 mp3
格式的音频文件数组。当这两个音频文件异步返回时,snapshot.data().audioFiles.length === 2
。这增加了一个条件。当又有两个声音(Castilian-male-IBM
和 Latin_American-female-IBM
)返回时,audioFilesReady === 3
和下一个函数 $scope.showNextWord()
将触发。
【讨论】:
如何使用 Cloud Firestore 中的云功能收听整个集合的特定字段。【参考方案4】:开箱即用我所做的就是使用 before 和 after 方法观察前后
const clientDataBefore = change.before.data();
console.log("Info database before ", clientDataBefore);
const clientDataAfter = change.after.data();
console.log("Info database after ", clientDataAfter );
例如,现在您应该比较特定字段的更改并执行一些操作或只是返回它。
更多关于 before.data() 和 after.data() here
【讨论】:
firebase.google.com/docs/functions/firestore-events 这是“谷歌云功能 - Cloud Firestore 触发器”的文档。这与这个主题完全不同 - 使用 Firestore onSnapshot 和 javascript。以上是关于Firestore - 听特定的字段变化?的主要内容,如果未能解决你的问题,请参考以下文章
获取具有等于flutter中特定字符串的字段的Firestore文档