Есть ли способ импортировать CSV или JSON в firebase cloud firestore, например, в базу данных реального времени firebase?
Как импортировать CSV или JSON в firebase cloud firestore
Ответ 1
Общее решение
Я нашел много вариантов сценария, позволяющего загружать JSON, но ни один из них не позволял создавать подколлекции. Мой скрипт выше обрабатывает любой уровень вложенности и вложенных коллекций. Он также обрабатывает случай, когда документ имеет свои собственные данные и вложенные коллекции. Это основано на предположении, что коллекция является массивом/объектом объектов (включая пустой объект или массив).
Чтобы запустить скрипт, убедитесь, что у вас установлены npm и узел. Затем запустите ваш код как node <name of the file>
. Обратите внимание, что нет необходимости развертывать его как облачную функцию.
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 in the 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 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 length of is always odd.
for (const key in data) {
// Resolve each collection.
await resolve(data[key], [...path, key]);
}
}
}
resolve(data);
Ответ 2
Для этого вам нужен пользовательский script.
Я написал один на основе SDK Firebase admin, если библиотека firebase не позволяет импортировать массивы вложенных массивов.
const admin = require('./node_modules/firebase-admin');
const serviceAccount = require("./service-key.json");
const data = require("./data.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://YOUR_DB.firebaseio.com"
});
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!");
})
.catch((error) => {
console.error("Error writing document: ", error);
});
});
}
});
Обновление: Я написал статью по этой теме - Заполнение Firestore данными
Ответ 3
Нет, вам нужно будет написать свой собственный script в настоящее время.
Ответ 4
Для справки. Я написал функцию, которая помогает импортировать и экспортировать данные в Firestore.
Ответ 5
Я использовал общее решение, предоставленное Maciej Caputa. Спасибо (:
Вот несколько советов. Предполагая, что у вас установлено приложение Ionic Firebase с необходимыми модулями узла Firebase в папке функций внутри этого решения. Это стандартная установка Ionic Firebase. Я создал папку для импорта, чтобы держать скрипт и данные на одном уровне.
Папка Иерархия
myIonicApp
functions
node_modules
firebase-admin
ImportFolder
script.js
FirebaseIonicTest-a1b2c3d4e5.json
fileToImport.json
Параметры скрипта
const admin = require('../myIonicApp/functions/node_modules/firebase-admin'); //path to firebase-admin module
const serviceAccount = require("./FirebaseTest-xxxxxxxxxx.json"); //service account key file
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://fir-test-xxxxxx.firebaseio.com" //Your domain from the hosting tab
});
Создание файла ключа учетной записи службы
- В консоли Firebase для вашего проекта, рядом с элементом Project Overwiew, щелкните значок шестеренки и выберите "Пользователи и разрешения".
- В нижней части экрана нажмите Расширенные настройки прав
- Откроется еще одна вкладка для консоли Google Cloud Platform.
- Слева выберите пункт Сервисные учетные записи
- Создать сервисную учетную запись для существующей сервисной учетной записи
Я просто добавил ключ к учетной записи службы App Engine по умолчанию
Функция Создать ключ предложит загрузить ключ в файл JSON
Структура данных JSON
Чтобы использовать предоставленный скрипт, структура данных должна быть следующей:
{
"myCollection" : {
"UniqueKey1" : {
"field1" : "foo",
"field2" : "bar"
},{
"UniqueKey2" : {
"field1" : "fog",
"field2" : "buzz"
}...
}
Ответ 6
https://gist.github.com/JoeRoddy/1c706b77ca676bfc0983880f6e9aa8c8
Это должно работать для объекта объектов (как правило, устанавливается старая firebase json). Вы можете добавить этот код в приложение, которое уже настроено с помощью Firestore.
Просто убедитесь, что вы указали на правильный файл JSON.
Удачи!
Ответ 7
Нет, на данный момент вы не можете.. firestore структурирует данные в другом формате, то есть с использованием коллекций, и каждая коллекция имеет ряд документов, которые затем хранятся в формате JSON.. в будущем они могут сделать инструмент конвертировать JSON в firestore.. для справки проверьте это
: https://cloud.google.com/firestore/docs/concepts/structure-data
**** ИЗМЕНИТЬ: ****
Вы можете автоматизировать процесс до некоторой степени, то есть написать макет программного обеспечения, которое только подталкивает поля данных CSV или JSON в вашу базу данных Cloud Firestore. Я перенес всю свою базу данных, создав простое приложение, которое извлекло мою БД и нажало на Firestore
Ответ 8
Это небольшая модификация, которая копирует "id" документа, если он существует, в его путь. В противном случае он будет использовать индекс "для".
...
...
} else {
// Collection length of is always odd.
for (const key in data) {
// Resolve each collection.
if (data[key]['id']!==undefined)
await resolve(data[key], [...path,data[key]['id']])
else
await resolve(data[key], [...path, key]);
}
}
}
resolve(data);
Ответ 9
1 - Импорт только коллекций
Если имена ваших коллекций состоят не только из цифр, то вы можете определить название документа следующим образом.
...
...
} else {
// Collection length of is always odd.
for (const key in data) {
// // Resolve each collection.
// If key is a number it means that it is not a collection
// The variable id in this case will be the name of the document field or you
// can generate randomly
let id = !isNaN(key) ? data[key].id : key;
await resolve(data[key], [...path, id]);
}
}
}
2 - Импорт коллекций и вложенных коллекций
Так же, как в примере выше, имя вложенной коллекции не может содержать только цифры.
...
...
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];
// If key is a number it means that it is not a collection
// The variable id in this case will be the name of the document field or you
// can generate randomly
let id = !isNaN(key) ? data[key].id : key;
// Resolve a colleciton.
resolve(data[key], [...path, id]);
}
}
...
...
Примечание. Изменения в коде @Maciej Caputa.
Ответ 10
var admin = require('firebase-admin');
var serviceAccount = require('./serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://csvread-d149c.firebaseio.com'
});
const csv = require('csv-parser');
const fs = require('fs');
const firestore = admin.firestore();
// CSV FILE data.csv
// Name,Surname,Age,Gender
// John,Snow,26,M
// Clair,White,33,F
// Fancy,Brown,78,F
fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (row) => {
console.log(row);
if(row) {
firestore.collection('csv').add({
name: row.Name,
surname: row.Surname,
age: row.Age,
sex: row.Gender
});
}
else {
console.log('No data')
}
})
.on('end', () => {
console.log('CSV file successfully processed');
});
Ответ 11
Этот обходной путь в Python может помочь некоторым людям. Сначала преобразуйте json или csv в dataframe с помощью Pandas, затем преобразуйте dataframe в словарь и загрузите словарь в firestore.
import firebase_admin as fb
from firebase_admin import firestore
import pandas as pd
cred = fb.credentials.Certificate('my_credentials_certificate.json')
default_app = fb.initialize_app(cred)
db = firestore.client()
df = pd.read_csv('data.csv')
dict = df.to_dict(orient='records')
my_doc_ref = db.collection('my_collection').document('my_document')
my_doc_ref.set(dict)
В javascript и других языках могут быть похожие обходные пути с использованием библиотек, похожих на Pandas.