如何使用节点读取在 Firestore 中创建的最新文档?

Posted

技术标签:

【中文标题】如何使用节点读取在 Firestore 中创建的最新文档?【英文标题】:How to read the latest document created in Firestore using node? 【发布时间】:2020-11-27 10:25:12 【问题描述】:

我编写了一个云函数,用于在我的数据库中侦听集合中的文档创建

这里是函数,

const functions = require('firebase-functions');
const admin = require('firebase-admin');
 
admin.initializeApp(functions.config().functions);
 
var newData;
 
exports.myTrigger = functions.firestore.document('FCM/id').onCreate(async (snapshot, context) => 
    //
 
    if (snapshot.empty) 
        console.log('No Devices');
        return;
    
 
    newData = 'hello';
 
    const deviceIdTokens = await admin
        .firestore()
        .collection('FCM')
        .get();
 
 var tokens = [];
 var i=0;
    for (var token of deviceIdTokens.docs) 
        tokens.push(token.data().ar1[i]);
        i++;
    
    var payload = 
        notification: 
            title: 'push title',
            body: 'push body',
            sound: 'default',
        ,
        data: 
            push_key: 'Push Key Value',
            key1: newData,
        ,
    ;
 
    try 
        const response = await admin.messaging().sendToDevice(tokens, payload);
        console.log('Notification sent successfully');

        
     catch (err) 
        console.log(err);
    
);

这个功能很奇怪,

例如,有时它会发送通知,有时则不会。

我不知道如何解决这个问题,

在我的 arr1 字段中,我有一组设备令牌,我想向其发送通知,

我希望该功能仅向刚刚创建的设备(使用令牌)发送通知(在新创建的文档中),然后删除该文档。

我认为它是一次向所有文档发送通知。

我是节点的新手..

是否只向仅存在于一个文档(..最新创建的文档)中的设备令牌发送通知?..我认为它正在向所有人发送通知。

请帮帮我。

更新:- 这是我的文档结构

【问题讨论】:

【参考方案1】:

首先,在 onCreate 处理程序中,您可以通过 snap 对象访问刚刚创建的文档的 id,您可以通过 snapshot.id 访问 id,通过 snapshot.data() 访问正文。

您已经获取了新创建的文档,因此无需获取整个集合。您应该替换整个部分:

const deviceIdTokens = await admin
.firestore()
.collection('FCM')
.get();
 
 var tokens = [];
 var i=0;
 for (var token of deviceIdTokens.docs) 
    tokens.push(token.data().ar1[i]);
    i++;
 

用这个:

const tokens = snapshot.data().ar1;

更新:要删除新文档,您可以这样做

await firestore().collection("FCM").doc(snapshot.id).delete();

因为新文档属于FCM 集合,而不是“helpReqs”

【讨论】:

谢谢,成功了!我还有一个问题,如何删除新创建的文档,我尝试了这段代码 const res = await admin.firestore.collection('helpReqs').doc(snapshot.id).delete();,但它没有工作。 在发送通知后删除文档是一个好习惯吗?我的意思是,它会增加我的账单金额吗? 是的,@MadhavamShahi,您需要为额外的文档删除付费(实际上是一笔很小的费用),但这并不是在您想要删除文档时不删除文档的原因,并且可以作为一种做法那。我已经编辑了我的答案,以展示如何删除新文档 唯一的问题是,该文件是否不再有用。我建议如果在FCM 中创建文档的唯一目的是使用ar1 中的tokens 进行通知,那么无需删除,只需继续访问新创建的文档即可。这样更便宜 嘿,谢谢你的解释,我明白了一切,:),是的,接受它(..我之前忘了^_^')再次感谢老兄。

以上是关于如何使用节点读取在 Firestore 中创建的最新文档?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MAC OS MATLAB 读取在 windows MATLAB 中创建的 .mat 文件

如何在 Flutter 中创建和读取一组键值对(映射)以在 Firestore 中存储数据

如何使用 javascript 中的 mouseover 事件删除我在 javascript 中创建的 DOM 节点?

在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件

如何使用云功能删除 Firestore 中的文档

如何获取firestore时间戳