Как импортировать CSV или JSON в firebase cloud firestore

Есть ли способ импортировать CSV или JSON в firebase cloud firestore, например, в базу данных реального времени firebase?

введите описание изображения здесь

Ответ 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 в настоящее время.

Ответ 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
});

Domain name from the Hosting tab

Создание файла ключа учетной записи службы

  • В консоли Firebase для вашего проекта, рядом с элементом Project Overwiew, щелкните значок шестеренки и выберите "Пользователи и разрешения".
  • В нижней части экрана нажмите Расширенные настройки прав

Accessing Google Cloud Platform Console

  • Откроется еще одна вкладка для консоли Google Cloud Platform.
  • Слева выберите пункт Сервисные учетные записи
  • Создать сервисную учетную запись для существующей сервисной учетной записи

Я просто добавил ключ к учетной записи службы App Engine по умолчанию

Функция Создать ключ предложит загрузить ключ в файл JSON

Creating the Service Account Key

Структура данных 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.