我无法使用自动生成的文档 ID 将数据批量上传到 firestore 子集合
I'm not able to bulk upload data to firestore sub-collections with auto-generated document IDs
我正在尝试使用 firebase-admin sdk 更新子集合中的数据。但是,没有上传数据。
collection-name --> auto-gen-doc-key --> sub-collection-name --> auto-gen-doc-key --> datas
const admin = require('./node_modules/firebase-admin');
const serviceAccount = require("./serviceAccountKey.json");
const data = require("./data.json");
const collectionKey = "movies"; //name of the collection
const documentKey = "my-document-key";
const subCollectionKey = "listItem";
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://my-database-url.firebaseio.com"
});
const firestore = admin.firestore();
const settings = { timestampsInSnapshots: true };
firestore.settings(settings);
if (data && (typeof data === "object")) {
Object.keys(data).forEach(docKey => {
firestore
.collection(collectionKey)
.doc(documentKey)
.collection(subCollectionKey)
.doc()
.set(data[docKey])
.then((res) => {
console.log("Document " + docKey + " successfully written!");
})
.catch((error) => {
console.error("Error writing document: ", error);
});
});
}
data.json 我尝试上传的文件,因为下面给出了子集合的文档。
[
{
"pr": 1,
"vi": "zAVmwt_U4c0",
"vn": "Dumdaar Khiladi",
"vd": "Watch #DumdaarKhiladi New Released Hindi Dubbed Full Movie Starring #RamPothineni, #AnupamaParameswaran",
"vvc": 210279385,
"tc": 517508
},
{
"pr": 2,
"vi": "R7aCOI4DuA0",
"vn": "A Aa",
"vd": "Watch & Enjoy #AAa New Hindi Dubbed Full Movie. Starring #Nithiin, #Samantha and #Anupama Parameshwaran. ",
"vvc": 206297429,
"tc": 372399
},
{
"pr": 3,
"vi": "ta7HoZFRKJQ",
"vn": "Supreme Khiladi-2",
"vd": "#HindiMovies #SouthMovie #SupremeKhiladi2#SaiDharamTej, #Anupama\nPresenting South (Sauth) Indian Movies Dubbed In Hindi Full Movie 2018 New (Hindi Movies, South Movie 2018, 2018 New Hindi Dubbed Movie) Supreme Khiladi 2 (Tej I Love U ).Starring #SaiDharamTej , #Anupama, Exclusively on Aditya Movies - Telugu & Hindi.",
"vvc": 148817263,
"tc": 534333
}
]
设置多个文档时,我建议使用 batch writes,因为根据我的经验,当您在一个函数中编写超过 ~10 个文档时,文档往往不会得到 updated/set。
参考您的代码实现如下:
// IMPORT
const admin = require('./node_modules/firebase-admin');
const serviceAccount = require("./serviceAccountKey.json");
const data = require("./data.json");
// VAR DECLARATION
const collectionKey = "movies"; //name of the collection
const documentKey = "my-document-key";
const subCollectionKey = "listItem";
// INIT
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://my-database-url.firebaseio.com"
});
const firestore = admin.firestore();
const settings = { timestampsInSnapshots: true };
firestore.settings(settings);
// UPLOADING
if (data && (typeof data === "object")) {
// CREATE BATCH WRITE
var batch = firestore.batch();
var path = collectionKey + "/" + documentKey + "/" + subCollectionKey;
var id;
// PRECREATE ID AND INSERT OPERATION INTO BATCH.
data.forEach(dat =>{
id = firestore.collection(path).doc().id;
batch.set(firestore.collection(path).doc(id), dat);
})
// COMMIT THE OPERATIONS, MIGHT WANT TO CONVERT THIS TO AN ASYNC AWAIT FUNCTION TO ENSURE THIS FUNCTION FINISHES.
batch.commit().then(res=>{
console.log("COMMIT SUCCESSFUL!");
return;
}).catch(e=>{
console.log(e.message);
})
}
我正在尝试使用 firebase-admin sdk 更新子集合中的数据。但是,没有上传数据。
collection-name --> auto-gen-doc-key --> sub-collection-name --> auto-gen-doc-key --> datas
const admin = require('./node_modules/firebase-admin');
const serviceAccount = require("./serviceAccountKey.json");
const data = require("./data.json");
const collectionKey = "movies"; //name of the collection
const documentKey = "my-document-key";
const subCollectionKey = "listItem";
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://my-database-url.firebaseio.com"
});
const firestore = admin.firestore();
const settings = { timestampsInSnapshots: true };
firestore.settings(settings);
if (data && (typeof data === "object")) {
Object.keys(data).forEach(docKey => {
firestore
.collection(collectionKey)
.doc(documentKey)
.collection(subCollectionKey)
.doc()
.set(data[docKey])
.then((res) => {
console.log("Document " + docKey + " successfully written!");
})
.catch((error) => {
console.error("Error writing document: ", error);
});
});
}
data.json 我尝试上传的文件,因为下面给出了子集合的文档。
[
{
"pr": 1,
"vi": "zAVmwt_U4c0",
"vn": "Dumdaar Khiladi",
"vd": "Watch #DumdaarKhiladi New Released Hindi Dubbed Full Movie Starring #RamPothineni, #AnupamaParameswaran",
"vvc": 210279385,
"tc": 517508
},
{
"pr": 2,
"vi": "R7aCOI4DuA0",
"vn": "A Aa",
"vd": "Watch & Enjoy #AAa New Hindi Dubbed Full Movie. Starring #Nithiin, #Samantha and #Anupama Parameshwaran. ",
"vvc": 206297429,
"tc": 372399
},
{
"pr": 3,
"vi": "ta7HoZFRKJQ",
"vn": "Supreme Khiladi-2",
"vd": "#HindiMovies #SouthMovie #SupremeKhiladi2#SaiDharamTej, #Anupama\nPresenting South (Sauth) Indian Movies Dubbed In Hindi Full Movie 2018 New (Hindi Movies, South Movie 2018, 2018 New Hindi Dubbed Movie) Supreme Khiladi 2 (Tej I Love U ).Starring #SaiDharamTej , #Anupama, Exclusively on Aditya Movies - Telugu & Hindi.",
"vvc": 148817263,
"tc": 534333
}
]
设置多个文档时,我建议使用 batch writes,因为根据我的经验,当您在一个函数中编写超过 ~10 个文档时,文档往往不会得到 updated/set。
参考您的代码实现如下:
// IMPORT
const admin = require('./node_modules/firebase-admin');
const serviceAccount = require("./serviceAccountKey.json");
const data = require("./data.json");
// VAR DECLARATION
const collectionKey = "movies"; //name of the collection
const documentKey = "my-document-key";
const subCollectionKey = "listItem";
// INIT
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://my-database-url.firebaseio.com"
});
const firestore = admin.firestore();
const settings = { timestampsInSnapshots: true };
firestore.settings(settings);
// UPLOADING
if (data && (typeof data === "object")) {
// CREATE BATCH WRITE
var batch = firestore.batch();
var path = collectionKey + "/" + documentKey + "/" + subCollectionKey;
var id;
// PRECREATE ID AND INSERT OPERATION INTO BATCH.
data.forEach(dat =>{
id = firestore.collection(path).doc().id;
batch.set(firestore.collection(path).doc(id), dat);
})
// COMMIT THE OPERATIONS, MIGHT WANT TO CONVERT THIS TO AN ASYNC AWAIT FUNCTION TO ENSURE THIS FUNCTION FINISHES.
batch.commit().then(res=>{
console.log("COMMIT SUCCESSFUL!");
return;
}).catch(e=>{
console.log(e.message);
})
}