首页 > 解决方案 > 将大量数据集从 JSON 导入 Cloud Firestrore

问题描述

我正在尝试将一个大型 JSON 文件(177k 记录)导入云存储,首先我找到了下面的代码;

上传代码

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,但真的不知道如何获得 499 行对于我的 JSON 的每次运行。

定时云功能

/* 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
});

标签: jsonfirebasegoogle-cloud-firestore

解决方案


我会做这样的事情:

  • 使用“start after”子句使计划函数一次获取 500 条记录。

  • 对数据库执行批量写入(您可能知道,批量写入限制为 500)

  • 如果成功,将这 500 条记录的最后一条记录(或对最后一条记录的引用:例如:记录的 ID)复制到数据库中的文档中。它可以是一个名为“upload_tracker”的文档,其中包含一个名为“last_uploaded”的字段。

  • 在后续操作中:该函数last_uploaded从您的数据库中查询记录,然后在最后一条记录之后执行另一个操作。

笔记:

. 如果您想快速完成,预定函数可以在终止之前写入多个批处理。

. 在您的 Google Cloud Console / Cloud Functions 中,如果您知道它会运行很长时间,您可能希望将函数的超时值延长到 9 分钟。

. 文件 ID 应反映您的“记录 ID”(如果有),以确保没有重复。


推荐阅读