我试图导入一个大JSON文件(177k记录)到云firestore,首先我发现下面的代码;
<<p>上传代码/strong>var admin = require("firebase-admin");
var serviceAccount = require("./service_key.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "my service key"
});
const firestore = admin.firestore();
const path = require("path");
const fs = require("fs");
const directoryPath = path.join(__dirname, "files");
fs.readdir(directoryPath, function(err, files) {
if (err) {
return console.log("Unable to scan directory: " + err);
}
files.forEach(function(file) {
var lastDotIndex = file.lastIndexOf(".");
var menu = require("./files/" + file);
menu.forEach(function(obj) {
firestore
.collection('academicians2')
.add({ 'department': obj['department'], 'designation': obj['designation'], 'field': obj['field'], 'name': obj['name'], 'university': obj['university'], 'reviewList': [], 'rating': 0 })
.then(function(docRef) {
console.log("Document written");
})
.catch(function(error) {
console.error("Error adding document: ", error);
});
});
});
});
但是在上传10-15k记录后开始给出错误,(我猜是内存错误),所以我决定每1.2秒调度云函数作为超时并批量写入此JSON到firestore,但真的不知道如何从我的JSON每次运行获得499行。
定时云功能
/* eslint-disable */
const functions = require("firebase-functions");
const admin = require('firebase-admin');
const { user } = require("firebase-functions/lib/providers/auth");
admin.initializeApp();
const firestore = admin.firestore();
const userRef = admin.firestore().collection('academicians2');
exports.scheduledFunction = functions.pubsub.schedule('every 1.2 seconds').onRun((context) => {
//do i need to create for loop for batch or how can i approach to solve this problem
});
我会这样做:
-
使计划函数一次获得500条记录,并在"后开始"条款。
-
对db执行批量写操作(批量写限制为500)
-
如果成功,将这500条记录的最后一条记录(或对最后一条记录的引用:例如:记录的ID)复制到数据库中的文档中。它可以是一个名为upload_tracker"有一个名为"last_uploaded"的字段。
-
在后续操作中:该函数从数据库中查询
last_uploaded
记录,然后从最后一条记录开始执行另一个操作。
指出:
。如果您希望快速完成,则调度函数可以在终止前写入多个批次。
。在你的Google Cloud Console/Cloud Functions中,如果你知道它要运行很长一段时间,你可能想把函数的超时值延长到9分钟。
。文件ID应反映您的"记录ID"。如果有的话,要确保没有重复的。