javascript - Firestore如何添加到子集合

标签 javascript firebase google-cloud-firestore

我想在集合中查找文档,并将项目添加到子集合(可能尚不存在):

projects (collection)
   project (doc)
      cluster (collection) // might not exist
        node1 (doc)  // might not exist
           statTypeA (collection)  // might not exist

我希望有这样的事情:

// Know the doc:
db.ref(`projects/${projectId}/cluster/node1/${statType}`).add()
// Or filter and ref:  
db.collection('projects').where(..).limit(1).ref(`cluster/node1/${statType}`).add()

我最终像这样解决了这个问题,但它很丑陋、冗长且缓慢,因为它必须首先返回大量读取操作。我这样做对吗?

const projectRefs = await db.collection('projects')
  .where('licenseKey', '==', licenseKey)
  .limit(1)
  .get();

if (!projectRefs.docs) {
  // handle 404
}

const projectRef = projectRefs.docs[0].ref;

const cluster = await projectRef.collection('cluster')
  .doc('node1').get();

await cluster.ref.collection(statType).add({ something: 'hi' });

编辑:

我最终以更好的方式处理这个问题的方法是结合展平到其他集合并使用数组进行统计。感觉好多了:

// projects
{
  projectId1
}

// instances (to-many-relationship) (filter based on projectId)
{
  projectId
  statTypeA: []
  statTypeB: []
}

最佳答案

你的“讨厌的事情”更接近事物的运作方式。

在第一次尝试中,您尝试将查询和文档创建合并到一个操作中。 SDK根本不是这样工作的。您要么正在使用任何给定的代码进行读取或写入,但绝不会同时进行这两种操作。您应该首先执行查询,找到文档,然后使用它来创建更多文档。

get()返回一个您需要用来等待查询结果的 promise 。正如您的代码当前假设的那样,结果无法立即获得。

documentation显示如何处理异步查询结果的示例代码。由于您的代码使用了 async/await,因此您可以根据需要对其进行转换。请注意,您必须迭代从返回的 Promise 中获取的 QuerySnapshot 来查看是否找到文档。

关于javascript - Firestore如何添加到子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55387124/

相关文章:

firebase - Firestore分布式计数器: How to know the ideal shards sum we need?

javascript - Export 语句中的 ESLint 解析错误

javascript - 如何在javascript中处理大数字

ios - 如何在发送时不显示推送消息的情况下运行该功能?

java - Firestore 查询文档以字符串开头

如果子集合中存在用户电子邮件,则使用 firebase 规则

JavaScript WebSQL 线程锁定安全

javascript - 下拉菜单、CSS、HTML 和 JavaScript : JavaScript making menu jump and not function correctly

firebase - 将数据保存到 Firebase 用户对象中

firebase - Flutter/Firebase-提取当前登录的用户数据时出错