【问题标题】:Chaining Firebase Firestore documents/collections链接 Firebase Firestore 文档/集合
【发布时间】:2019-11-04 19:40:03
【问题描述】:

所以,我有一个这样的 Firestore 数据库组。

companies > acme-industries > items > [] OR collection > document > collection > document

最好将所有项目存储在一个基本集合中,然后为每个项目添加一个字符串值来定义它所属的公司吗?然后只查询与该公司关联的所有项目的项目集合?

我正在尝试检索项目并通过我的 firebase 函数中的 forEach 运行它们。我尝试了两种不同的方法并观看了多个视频,但仍然没有得到结果。

首次尝试代码块

这导致了 500 服务器错误,没有返回任何解释。

const itemQuerySnapshot = db.collection('companies').doc(data.userData.company).collection('items').get();
const items: any = [];
itemQuerySnapshot.forEach((doc:any) => {
  console.log('doc', doc.data());
  items.push({
   id: doc.id,
   data: doc.data()
  });
});
response.json(items);

第二次尝试代码块

这导致No Such Documents! 被返回

const itemRef = db.collection('companies').doc(data.userData.company).collection('items');
itemRef.get().then((doc:any) => {
    if(!doc.exists) {
        response.send('No such documents!');
    } else {
        response.send('Document Data: '+ doc.data());
    }
}).catch((err:any) => {
    response.status(500).send(err);
});

我期待此调用返回的所有项目的数组之类的东西。我对 Firebase Firestore 完全陌生,我在这里缺少什么?

更新

我用 第三次尝试代码块 替换了我的代码,并通过 console.log(doc.data()) 获得了成功。但是,项目对象仍然返回空。这是因为它在 for each 完成之前返回吗?如果是这样,您将如何防止这种情况以确保应退回的每一件物品都是?

const items: any = [];
const userRef = db.collection("companies").doc(data.userData.company);
const itemsRef = userRef.collection("items");
itemsRef
  .get()
  .then((snapshot: any) => {
    snapshot.forEach((doc: any) => {
      console.log(doc.data());
      items.push({
        id: doc.id,
        data: doc.data()
      });
    });
  })
  .catch((err: any) => {
    response.status(500).send(err);
  });
response.json(items);

您将如何再添加一份文档?假设您想获得一件物品。你会怎么做?以下总是导致从我的函数返回Item does not exist

const companyRef = db.collection('companies').doc(data.userData.company);

const itemRef = companyRef.collection('items');

const item = itemRef.where('number', '==', itemSku).get();

我一定是做错了什么,因为所有视频都告诉我从 Firestore 获取数据非常容易。但我还没有看到。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    get 返回一个 Promise ,一旦从 firestore 准备好数据,就会调用 then 函数的回调。

    response.json(items); 行将在正确收集项目数组之前被调用。

    你需要在then回调中移动这一行

    签出这个:

    .then((snapshot: any) => {
        snapshot.forEach((doc: any) => {
            console.log(doc.data());
            items.push({
                id: doc.id,
                data: doc.data()
            });
        });
    
        response.json(items);    //items ARRAY IS READY , YOU CAN SEND YOUR RESPONSE HERE 
    })
    

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 1970-01-01
      • 2019-06-27
      • 2019-06-26
      • 2020-10-27
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2018-04-09
      相关资源
      最近更新 更多