Firestore Cloud Function 空集合

mat*_*tox 4 javascript firebase google-cloud-functions google-cloud-firestore

我有一个问题困扰了我好几天。我正在尝试创建一个从 Firestore 数据库读取的 Firebase Cloud 函数。

我的 Firestore 数据库如下所示:

在此输入图像描述

问题是我不能users这样列出:

db.collection('users').get().then((snapshot) => snapshot.forEach(...));
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样做,我会得到空响应,就像我的集合中没有用户一样users

但我尝试直接访问用户,它有效:

await db.collection('users/5CZxgu8nmNXu2TgplwOUdOIt8e33/receipts').get()
Run Code Online (Sandbox Code Playgroud)

我的完整代码:

import * as functions from 'firebase-functions';

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

exports.cat = functions.https.onRequest(async (req, res) => {
    const receiptList: any = [];
    const db: Firestore = admin.firestore();

    const usersRef = await db.collection('users').get();
    console.log(usersRef.empty);        // Returns true

    const receiptsRef = await db
        .collection('users/5CZxgu8nmNXu2TgplwOUdOIt8e33/receipts')
        .get();

    receiptsRef.forEach((receipt: any) => {
        console.log(receipt);
        receiptList.push(receipt);
        // Here I can access data
    });

    res.send(receiptList);
    return '';
});
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么?谢谢你!

Dou*_*son 8

您的用户集合实际上是空的。看到文档 ID 是如何以斜体显示的吗?这意味着实际上并没有文档在其位置,但是,有一些子集合,其下组织有文档。

当您查询集合时,您只能获取紧邻该集合的文档。查询不会选取子集合中组织的文档。在这方面,查询被认为是“浅薄的”。正如您所看到的,您需要更深入地了解子集合才能获取其文档。

最重要的是,您所显示的查询正在完全执行它们应该执行的操作。

  • 如果要查询具有相同名称的所有子集合,请考虑使用集合组查询。https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query (2认同)

mat*_*tox 5

再次感谢道格的帮助。

我设法解决我的问题。这是我的完整解决方案。

import * as functions from 'firebase-functions';
import {
    Firestore
} from '@google-cloud/firestore';

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

exports.cat = functions.https.onRequest(async (req, res) => {
    const receiptList: any = [];
    const db: Firestore = admin.firestore();

    const receipts = await db.collectionGroup('receipts').get();
    receipts.forEach((doc: any) => {
        console.log(doc.id, ' => ', doc.data());
        receiptList.push(doc.data());
    });
    res.send(receiptList);
    return '';
});
Run Code Online (Sandbox Code Playgroud)


小智 5

.get()获取所有文档。在您的情况下,这些文档是空的,因此.get()不考虑它们。

我为此找到的最简单的解决方案是将 替换.get().listDocuments(). 现在您可以像阅读文档一样阅读每个文档条目。