我环顾四周,但找不到明显的解决方案。
我有一个包含 130k 文档的集合。我需要将它们导出为 CSV 文件。 (我认为我已经排序的 CSV 部分)。
我的代码在较小的集合上运行良好,但在集合中的 130k 文档上尝试它时它挂起并且我得到“请求中止”。处理这个问题的最佳方法是什么?
我的代码:
db.collection("games")
.doc(req.params.docid)
.collection("players")
.onSnapshot(snapshot => {
console.log("On Snapshot")
snapshot.docs.forEach(data => {
const doc = data.data();
downloadArray.push(doc);
});
jsonexport(downloadArray, function(err, csv) {
if (err) return console.log(err);
fs.writeFile("out.csv", csv, function() {
res.sendFile(path.join(__dirname, "../out.csv"), err => {
console.log(err);
});
});
});
});
我正在按照建议尝试分页,但是我无法理解如何在循环完成之前继续调用下一批,因为有时我不知道集合大小,也无法查询如此大的集合大小需要 1-2 分钟。
let first = db
.collection("games")
.doc(req.params.docid)
.collection("players")
.orderBy("uid")
.limit(500);
let paginate = first.get().then(snapshot => {
// ...
snapshot.docs.map(doc => {
console.log(doc.data());
});
// Get the last document
let last = snapshot.docs[snapshot.docs.length - 1];
// Construct a new query starting at this document.
let next = db
.collection("games")
.doc(req.params.docid)
.collection("players")
.orderBy("uid")
.startAfter(last.data())
.limit(500);
最佳答案
你可以 paginate your query with cursors将结果集的大小减小到更易于管理的程度,并继续向前分页直到集合完全迭代。
此外,您还需要使用 get()而不是 onSnapshot(),因为导出过程可能对接收集合中可能添加、更改或删除的任何文档的更新不感兴趣。
关于javascript - Firestore - 获取大量集合并进行解析。请求被中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57469947/