В Firestore мне удалось сохранить свою большую базу данных JSON с помощью первого решения этого потока (код, на который я ссылаюсь, находится ниже по ссылке): Как импортировать CSV или JSON в Firebase Cloud Firestore.
const admin = require('../functions/node_modules/firebase-admin');
const serviceAccount = require("./service-key.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<your-database-name>.firebaseio.com"
});
const data = require("./fakedb.json");
/**
* Data is a collection if
* - it has a odd depth
* - contains only objects or contains no objects.
*/
function isCollection(data, path, depth) {
if (
typeof data != 'object' ||
data == null ||
data.length === 0 ||
isEmpty(data)
) {
return false;
}
for (const key in data) {
if (typeof data[key] != 'object' || data[key] == null) {
// If there is at least one non-object item then it data then it cannot be collection.
return false;
}
}
return true;
}
// Checks if object is empty.
function isEmpty(obj) {
for(const key in obj) {
if(obj.hasOwnProperty(key)) {
return false;
}
}
return true;
}
async function upload(data, path) {
return await admin.firestore()
.doc(path.join('/'))
.set(data)
.then(() => console.log(`Document ${path.join('/')} uploaded.`))
.catch(() => console.error(`Could not write document ${path.join('/')}.`));
}
/**
*
*/
async function resolve(data, path = []) {
if (path.length > 0 && path.length % 2 == 0) {
// Document's length of path is always even, however, one of keys can actually be a collection.
// Copy an object.
const documentData = Object.assign({}, data);
for (const key in data) {
// Resolve each collection and remove it from document data.
if (isCollection(data[key], [...path, key])) {
// Remove a collection from the document data.
delete documentData[key];
// Resolve a colleciton.
resolve(data[key], [...path, key]);
}
}
// If document is empty then it means it only consisted of collections.
if (!isEmpty(documentData)) {
// Upload a document free of collections.
await upload(documentData, path);
}
} else {
// Collection's length of is always odd.
for (const key in data) {
// Resolve each collection.
await resolve(data[key], [...path, key]);
}
}
}
resolve(data);
Проблема в том, что я хочу получить данные с "идентификатором" из моего углового приложения из Firestore.Прямо сейчас, подпапки, которые были созданы в Firestore, идут от 0 до n.Вместо этого я хочу назначить «id» объектов массива в качестве имен подпапок в Firestore.Это общий вопрос JavaScript, я думаю.Я просто не знаком с синтаксисом, используемым в предоставленном коде.Я также давно не пишу и надеюсь, что кто-нибудь может мне помочь.
Это структура моей базы данных JSON
{
"customCollection": [{
"p": "6",
"c": "",
"m": 0.1,
"id": "60.1" //this id should be the subfolder's name in Firestore
},
{
"p": "5",
"c": "",
"m": 0.1,
"id": "50.1"
}]
}
Так что в Firestore структура должна быть:
customCollection -> 60.1 -> данные первого объекта
customCollection -> 50.1 -> данные второго объекта
вместо:
customCollection ->0 -> данные первого объекта
customCollection -> 1 -> данные второго объекта
Заранее спасибо за любую помощь!