![](/img/trans.png)
[英]How to export dynamic nested collection data in cloud firestore using node js?
[英]How to import collection and nested collection data in cloud firestore using node js?
如何使用节点 js 在 Cloud Firestore 中导入集合和嵌套集合数据?
我使用此代码从 json 文件导入到云火灾数据库,但仅在收集数据上导入
const admin = require('firebase-admin');
const serviceAccount = require("./servicekey.json");
const data = require("./data.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "database-url";
});
data && Object.keys(data).forEach(key => {
const nestedContent = data[key];
if (typeof nestedContent === "object") {
Object.keys(nestedContent).forEach(docTitle => {
admin.firestore()
.collection(key)
.doc(docTitle)
.set(nestedContent[docTitle])
.then((res) => {
console.log("Document successfully written!",res);
})
.catch((error) => {
console.error("Error writing document: ", error);
});
});
}
});
我的 json 文件格式这个文件可以有集合和子集合数据或嵌套集合数据
{
"messages2": {
"1585135109814test": {
"Ref_Chat_Type": 1,
"Last_Content_Time": "1585135492165",
"Member_Ids": ["xxx", "yyy"],
"AdminUsers": ["yyy"],
"Group_Desc": "Ttt",
"Members": [{
"User_Profile_Pic": null,
"User_Id": "xxx",
"User_Name": "vvv"
}, {
"User_Name": "sss",
"User_Profile_Pic": "",
"User_Id": "yyy"
}, {
"User_Name": "rrr",
"User_Profile_Pic": "",
"User_Id": "zzz"
}],
"Last_Content": "vhh",
"Last_Content_From_Id": "yyy",
"Group_Name": "Test",
"Group_Id": "1585135109814test",
"Last_Content_From_Username": "vvv",
"Group_Pic": "",
"subCollection": {
"messages2/1585135109814test/1585135109814test": {
"0NBKTa2Py9HvRK0yNxLa": {
"Ref_Content_type": 1,
"Content_Timestamp": 1588673106,
"From_Id": "xxx",
"Content_Id": "0NBKTa2Py9HvRK0yNxLa",
"Group_Id": "1585135109814test",
"From_User_Profile_Pic": "",
"Content": "55",
"Content_Read_By": null,
"From_Username": "vvv"
}
}
}
}
}
}
我使用了批处理概念,这段代码出现了错误
C:\xampp\htdocs\task>节点importmain.js
错误:
C:\xampp\htdocs\task\node_modules\firebase-admin\lib\firebase-namespace.js:101 throw new error_1.FirebaseAppError(error_1.AppErrorCodes.NO_APP, errorMessage); ^
FirebaseAppError:默认的 Firebase 应用程序不存在。 确保在使用任何 Firebase 服务之前调用 initializeApp()。 在 FirebaseAppError.FirebaseError [作为构造函数] (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\utils\error.js:42:28) 在 FirebaseAppError.PrefixedFirebaseError [作为构造函数] (C:\ xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\utils\error.js:88:28) 在新的 FirebaseAppError (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\utils \error.js:122:28) 在 FirebaseNamespaceInternals.app (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\firebase-namespace.js:101:19) 在 FirebaseNamespace.app (C: \xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\firebase-namespace.js:402:30) 在 FirebaseNamespace.ensureApp (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib \firebase-namespace.js:418:24) 在 FirebaseNamespace.fn (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\firebase-namespace.js:327:30) 在 Object。 (C:\xampp\htdocs\task\importmain.js:4:16) [90m at Module._compile (internal/modules/cjs/loader.js:776:30)[39m [90m at Object.Module._extensions。 .js (internal/modules/cjs/loader.js:787:10)[39m { errorInfo: { code: [32m'app/no-app'[39m, message: [32m'默认Firebase应用不存在。 确保在使用任何 Firebase 服务之前调用 initializeApp()。'[39m },codePrefix: [32m'app'[39m}
问题在于firebase-admin
的初始化。
根据文档,正确的语法如下:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
您应该调用不带任何参数的admin.initializeApp()
。
请尝试一下,让我知道它是否适合您。
您不能通过一次调用 Firestore“文档写入方法”(例如set()
、 update()
或add()
)来写入文档及其子集合的文档。
您需要合并多个调用。
推荐的方式是使用批量写入,如下:
const db = admin.firestore();
let batch = db.batch();
// Set the value of Parent
var pRef = db.collection(key).doc(docTitle);
batch.set(pRef, {...});
// Set the value of Child
var cRef = db.collection(key).doc(docTitle).collection("....").doc("...");
batch.set(cRef, {...});
// Commit the batch
batch.commit().then(function () {
// ...
});
因此,具体而言,您需要解析 json,以便生成文档/集合路径和相应的 JavaScript 对象,以传递给批量写入的set()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.