如何在单个查询中选择多个文档引用?

时间:2019-06-14 13:57:58

标签: javascript performance google-cloud-firestore non-relational-database

我有两个Firestore集合,一个叫做parents,另一个叫做children。这些集合是“相关的”,因为parents具有附加的child个文档引用数组。

我要完成的任务是::以一种高效的方式,将所有与children“相关”的parent与之关联。

我尝试过的事情:我想出了这段功能强大的代码:

this.subscription = this.props.firebase.parent().onSnapshot((parent) => { // get a single parent

    let childrenPromises = (parent.data().children || []).map(child => this.props.firebase.child(child.id).get()); // build array of promises

    Promise.all(childPromises) // resolve all promises
        .then(children => {
            // children.data() has the data I need :)
        });
});

总结:我检索child文档参考的列表,然后使用promises分别检索所有参考。效果很好,但是用查询请求轰炸了我的数据库。

我要改进的地方:能否以某种方式将其重构为一个性能更高的查询?理想情况下,这将是单个查询,以防止对数据库发出如此多的请求。

我尝试过的事情:我已阅读完所有的Firestore文档和Stack Overflow帖子,但运气不佳。我确实读过,对数据库进行非规范化是一个选项,但是我不希望这样做,因为可以将多个parents绑定到children

任何帮助或建议,在这里都表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

否,不可能在单个查询中跨名称不同的集合进行查询。没有“ join”类型的操作。

您现在正在做什么并没有真正“轰炸” Firestore。它是为跟上许多文档读取而构建的,所有查询都通过单个连接进行流水线处理。此处的性能或可伸缩性实际上不是问题,除非您请求的数据量超过所需。实际上,Cloud Firestore根本不允许您执行任何无法扩展的事情。所有索引操作都大规模扩展。