Firebase 在云功能中访问云firestore文档

Firebase 在云功能中访问云firestore文档,firebase,google-cloud-functions,google-cloud-firestore,Firebase,Google Cloud Functions,Google Cloud Firestore,在我的Google Firebase Firstore数据库中,我想收集聚合数据,例如一个集合有多少文档。由于Firestore不提供聚合查询,因此我正在尝试编写一个云函数,该函数将在每次将文档添加到数据库时增加一个字段,该数据库将包含集合拥有的文档数 我面临的问题是,我一辈子都无法弄清楚如何使用nodejs从云函数中的Firestore获取文档 以下是我正在做的: 在我的index.js文件的顶部,我配置了管理员SDK以及您喜欢的内容: const functions = require('f

在我的Google Firebase Firstore数据库中,我想收集聚合数据,例如一个集合有多少文档。由于Firestore不提供聚合查询,因此我正在尝试编写一个云函数,该函数将在每次将文档添加到数据库时增加一个字段,该数据库将包含集合拥有的文档数

我面临的问题是,我一辈子都无法弄清楚如何使用nodejs从云函数中的Firestore获取文档

以下是我正在做的:

在我的
index.js
文件的顶部,我配置了管理员SDK以及您喜欢的内容:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
然后,对于我的云功能,我执行以下操作:

exports.createPost = functions.firestore
  .document('posts/{post_id}')
  .onCreate(event => {

    // Get the post object
    var post = event.data.data();

    var senderID = post["sender_id"]; // This is not null

    // Access to user's document and the main ledger document
    const userDocRef = admin.database().ref('/users').orderByChild("user_id").equalTo(senderID).once('value')
    const ledgerDocRef = admin.database().ref('/posts/ledger').once('value');

    return Promise.all([userDocRef, ledgerDocRef]).then(snapshot => {

        const user = snapshot[0].val();
        const ledger = snapshot[1].val();

        console.log("user => "+user); // Logs: user => null
        console.log("ledger => "+ledger); // Logs: ledger => null

        const userPostCount = user["user_name"];
        const globalPostCount = ledger["global_post_count"] + 1;

        const userUpdate = user.update({"post_count" : userPostCount});
        const ledgerUpdate = ledger.update({"global_post_count" : globalPostCount});

        return Promise.all([userUpdate, ledgerUpdate]);
    });
});
我最后得到了一个错误:

TypeError:无法读取null的属性“global\u post\u count” 好的,那就拍快照吧

我想这意味着我的问题出了问题,但我不知道是什么。
用户
帖子
都是根级别的集合

我还收到一条警告,上面写着:

未配置计费帐户。外部网络不可访问且 配额受到严格限制

从我在网上读到的,我不认为这会影响它,但我认为这是值得注意的


请提供帮助。

看起来您已经编写了Firestore触发器,但随后将进入实时数据库进行查询:

const userDocRef = admin.database().ref('/users').orderByChild("user_id").equalTo(senderID).once('value')
const ledgerDocRef = admin.database().ref('/posts/ledger').once('value');
如果您的RTDB为空,这些查询也将以空结束


要查询Firestore,您需要使用
admin.Firestore()
而不是
admin.database()
。Firestore(通过我刚刚链接的云SDK)比RTDB更具吸引力,但它们在某些方面是相似的。

Ohhh我现在明白了,这是非常巧妙的。感谢您的回答,在过去的几个小时里,我在这件事上一直碰壁。@DougStevenson-我遇到了类似的问题,并尝试在我的云函数
functions.https.onCall()
中使用
admin.firestore().ref('qa/content/feed/main/content/'+contentTitle.)get()键入call。然后(function(doc){…}
但是我收到了错误
未处理的错误类型error:admin.firestore(…).ref不是一个函数
@AdamHurwitz,您可能需要导入
firebase admin
sdk。如果您仍然遇到此问题,请尝试在代码前面添加以下行:
const admin=require('firebase-admin'));admin.initializeApp();