Firestore + 云功能:如何从另一个文档中读取

Posted

技术标签:

【中文标题】Firestore + 云功能:如何从另一个文档中读取【英文标题】:Firestore + cloud functions: How to read from another document 【发布时间】:2018-05-11 08:34:13 【问题描述】:

我正在尝试编写一个从另一个文档读取的 Google 云函数。 (其他文档=不是触发云功能的文档。)

要弄清楚如何做这么简单的事情有点寻宝。

    云功能文档似乎建议查看 admin SDK:“您可以通过 DeltaDocumentSnapshot 界面或通过 Admin SDK 进行 Cloud Firestore 更改。”

    https://firebase.google.com/docs/functions/firestore-events

    Admin SDK 建议编写以下代码行来获取客户端。但是哦,不,它不会向客户解释。它会让我们在文档中的其他地方大打出手。

    var defaultFirestore = admin.firestore();

    “默认的 Firestore 客户端(如果未提供应用)或与提供的应用关联的 Firestore 客户端。”

    https://firebase.google.com/docs/reference/admin/node/admin.firestore

    该链接解析为一般概述页面,没有直接线索来弄清楚接下来的事情。

    https://cloud.google.com/nodejs/docs/reference/firestore/0.10.x/

    深入挖掘,有一个很有前途的类,叫做 FireStoreClient。它有一个看起来很有希望的“getDocument”方法。参数看起来很复杂。与其简单地将路径传递给方法,不如将整个文档/集合作为参数。

    https://cloud.google.com/nodejs/docs/reference/firestore/0.10.x/FirestoreClient#getDocument

    var formattedName = client.anyPathPath("[PROJECT]", "[DATABASE]", "[DOCUMENT]", "[ANY_PATH]"); client.getDocument(name: formattedName).then(function(responses) var response = responses[0]; // doThingsWith(response) )

所以,我正在尝试将所有这些信息合并到一个谷歌云函数中,该函数将从另一个文档中读取。

const functions = require('firebase-functions');

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.updateLikeCount4 = functions.firestore
    .document('likes/likeId').onWrite((event) => 
        return admin.firestore()
            .getDocument('ruleSets/1234')
            .then(function(responses) 
                 var response = responses[0];
                 console.log('Here is the other document: ' + response);
             )
    );

这种方法失败了:

admin.firestore.getDocument is not a function

我也试过了。 admin.firestore.document、admin.firestore.doc、admin.firestore.collection 等等。它们似乎都不是函数。

我只想从我的 Google 云功能中的另一个 Firestore 文档中读取。

PS:他们说文档是你的朋友。这份文件是一场噩梦,遵循将所有线索分散到四个风向的原则!

【问题讨论】:

这是另一个错误的开始。 Firebase 有一个带有示例的 GitHub 存储库:github.com/firebase/functions-samples/blob/master/quickstarts/… 这是示例的相关部分:admin.firestore().collection('messages').add(original: original).then(writeResult => 我已经针对我的代码进行了调整。它也因错误而失败。 据我所知,您的第一个 sn-p 应该是 admin.firestore().doc('ruleSets/1234').get().then(...admin.firestore().collection('ruleSets').doc('1234').get().then(... 非常感谢!是的,它现在终于可以工作了! 【参考方案1】:

谢谢你,@frank-van-puffelen。

这是可行的解决方案:

exports.updateLikeCount = functions.firestore
    .document('likes/likeId').onWrite((event) => 
        return admin.firestore()
            .collection('ruleSets')
            .doc(1234)
            .get()
            .then(doc => 
                console.log('Got rule: ' + doc.data().name);
            );
    );

【讨论】:

以上是关于Firestore + 云功能:如何从另一个文档中读取的主要内容,如果未能解决你的问题,请参考以下文章

云功能/Firestore。当字段位于不同文档中时如何触发

引用了 Firestore 如何从另一个集合文档 id 中获取集合值

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

使用云功能更新 Firestore 文档

Firestore - 云功能 - 获取删除文档的用户的 uid

Firestore / Cloud功能 - 如何在更改时更新Firestore数据